for 循环中的子集数据框

Subset data frame within a for loop

抱歉,如果这个问题是 repetitive/extremely 基本问题,但我找不到任何可以回答我的具体问题的内容。我有一个包含多个变量的数据框,我想根据每列中的信息对其进行子集化,并为每个变量创建新的数据框。示例数据如下。 数据:

Column I Want var1 var2 var3
A             NA   NA   Y
B             Y    NA   NA
C             NA   NA   NA
D             Y    Y    NA
E             Y    NA   Y
F             NA   Y    Y 
G             NA   NA   Y 

最后,我希望每一列都有单独的数据框,如下所示: 变量 1:

Column I Want
B
D
E

var2:

Column I Want
D
F

var3:

Column I Want
A
E
F
G

这是我的代码:

names <- names(data)
for (i in 1:length(names)) {
  assign(names[i], subset(data, names[i] == "Y", select = "Column I Want"))
}

这将给我三个单独的数据框,其中包含我想要的列,但是,每个数据框中有 0 个观察值。我怀疑我在 'names[i] == "Y"' 部分做错了什么,但我不太明白。任何人都可以帮忙提供一个简单的答案吗?谢谢!

不要使用 assign 而是使用 list

# for loop approach
results = list()
for(nm in names(data)[-1]) { # omit the first column
  results[[nm]] = data[data[[nm]] %in% "Y", "Column I want", drop = FALSE]
}

# lapply approach
results = lapply(data[-1], function(col) data[col %in% "Y", "Column I want", drop = FALSE])

drop = FALSE 参数可确保您得到 1 列数据框,而不是向量。

至于您的方法中的问题,names[i] 只是一个字符串,因此您正在测试 "var2" == "Y" 是否为假。

另一种选择是:

df <- read.table(header = TRUE, text =
"Column var1 var2 var3
A             NA   NA   Y
B             Y    NA   NA
C             NA   NA   NA
D             Y    Y    NA
E             Y    NA   Y
F             NA   Y    Y 
G             NA   NA   Y" )

lapply(df[,-1], function(x) df$Column[x=="Y" &!is.na(x)])
$var1
[1] "B" "D" "E"

$var2
[1] "D" "F"

$var3
[1] "A" "E" "F" "G"