我有一个按年份索引的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
}
答案 0 :(得分:1)
您可以使用lapply
:
res <- lapply(df, FUN = function(x) {
setdiff(x = b, y = x$col1)
})
res
$`2010`
[1] "g"
$`2011`
[1] "a" "g"
答案 1 :(得分:0)
一种简单的方法是将所有内容保存在data.frame中:
library(tidyverse)
df = data_frame(col1 = c('a', 'b', 'c', 'd'),
year = c(2010, 2010, 2011, 2011))
b <- c('a', 'g')
df %>% group_by(year) %>%
summarise(missing_vals = list(setdiff(b, col1))) %>%
unnest()
#> # A tibble: 3 × 2
#> year missing_vals
#> <dbl> <chr>
#> 1 2010 g
#> 2 2011 a
#> 3 2011 g
在基础R中可能转化为
do.call(rbind,
apply(aggregate(col1 ~ year, df,
function(x){setdiff(b, x)}),
1, data.frame))
#> year col1
#> 1 2010 g
#> 2 2011 a
#> 3 2011 g
从这一点开始,按year
或col1
分组的操作很容易。