setdiff用于不使用循环的数据帧列表

时间:2017-04-27 22:03:37

标签: r dataframe

我有一个按年份索引的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
}

2 个答案:

答案 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

从这一点开始,按yearcol1分组的操作很容易。