R选择行和列

ogsagwnx  于 2023-05-26  发布在  其他
关注(0)|答案(3)|浏览(93)

我是新来的,有两个问题。所以我有一个看起来像这个表的dataframe:
| nr| c0| C1| C2| C3|
| - -----|- -----|- -----|- -----|- -----|
| 一个|一个|B|我的天|Z|
| 2| Z| U| C类|我的天|
| 3| N| K| N| D|
| 4|我的天|L型|Y| E|
首先,我想找到所有包含字符串 M 的列,并将列名存储在一个新的dataframe或列表中:
| c_names|
| - -----|
| c0|
| C2|
| C3|
其次,我想选择包含字符串 M 的所有行:
| nr| c0| C1| C2| C3|
| - -----|- -----|- -----|- -----|- -----|
| 一个|一个|B|我的天|Z|
| 2| Z| U| C类|我的天|
| 4|我的天|L型|Y| E|
谢谢你!

2lpgd968

2lpgd9681#

  • 第一个问题
> data.frame(c_names = names(df)[colSums(df == "M") > 0])
  c_names
1      c0
2      c2
3      c3
  • 第二个问题
> subset(df, rowSums(df == "M") > 0)
  nr c0 c1 c2 c3
1  1  A  B  M  Z
2  2  Z  U  C  M
4  4  M  L  Y  E
pkbketx9

pkbketx92#

我们可以使用grepl来搜索字符串中的匹配,输出是逻辑的。

c_names <- colnames(df)[grepl("M", df)]
c_names
[1] "c0" "c2" "c3"

对于第二个问题,我们可以使用rowSums来查找等于“M”的单元格,并将其转换为用于索引的逻辑向量。

df[as.logical(rowSums(df == "M")),]
  nr c0 c1 c2 c3
1  1  A  B  M  Z
2  2  Z  U  C  M
4  4  M  L  Y  E
bjp0bcyl

bjp0bcyl3#

以下是tidyverse的组合方法:

library(dplyr)
library(tidyr)

df %>% 
  mutate(across(-nr, ~case_when(. == "M" ~ cur_column()), .names = 'new_{col}')) %>% 
  unite(c_names, starts_with('new'), na.rm = TRUE, sep = ' ') %>% 
  filter(rowSums(across(everything(), ~ . == "M")) > 0)
nr c0 c1 c2 c3 c_names
1  1  A  B  M  Z      c2
2  2  Z  U  C  M      c3
3  4  M  L  Y  E      c0

相关问题