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"
抱歉,如果这个问题是 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"