【发布时间】:2017-09-25 21:22:18
【问题描述】:
我有一个按年份索引的 data.frames 列表,我想在这些嵌套 data.frames 中的列和单独的向量之间使用setdiff。
对于 data.frames a 和向量 b 的列表。现在我正在遍历元素
for (i in a) {
missing_values = setdiff(x = b, y = i$col1)
print(missing_values) #this has what I want
store_values[i$year[[1]]] = list(missing_values) #actually this doesn't work as expected but not sure why
}
setdiff(x = b, y = a$'2010'$col1) #returns what I want for 1 data.frame
除了循环还有其他方法吗?
store_values
[[1]]
[1] NA
[[2]]
[1] NA
[[3]]
[1] NA
[[4]]
[1] NA
不确定这个问题是否需要样本数据,但如果需要,我可以提供一些。
样本数据:
df <- data.frame(matrix(ncol = 2, nrow = 4))
colnames(df) <- c('col1', 'year')
df$col1 <- c('a', 'b', 'c', 'd')
df$year <- c(2010, 2010, 2011, 2011)
df <- split(df, df$year)
b <- c('a', 'g')
setdiff(x = b, y = df$`2010`$col1) #g
store_values <- ls()
for (i in df){
missing_values <- setdiff(x = b, y = i$col1)
print(missing_values) # good
store_values[i$year[[1]]] <- list(missing_values) # no good
}
【问题讨论】:
-
你确定
a$'2010'$col1返回你想要的吗?无论如何,您应该提供 a 和 b 以使其可重现,.. -
@BigDataScientist 添加了一些示例数据
-
在我看来,按年分割 df 是一个相当糟糕的主意。现在,您将年份存储为数字和字符串(每个 df 的名称),并且必须在此处和每个后续步骤中进行循环或 lapply 之类的扭曲)...使用 data.table,您可以这样做
fsetdiff(CJ(col1 = b, year = unique(DT$year)), DT)或类似的 dplyr 的 setdiff 以及 expand.grid。 -
@Frank 从未真正使用过
data.tables,在这种情况下我是否必须将df更改为data.table? -
你说的太对了。
lapply是我新的最大敌人。真是一场灾难。