【问题标题】:Removing dataframes from list of dataframes based on condition using for loop in R在R中使用for循环根据条件从数据帧列表中删除数据帧
【发布时间】:2021-03-16 19:13:04
【问题描述】:

考虑以下名为mat 的数据。我的目标是计算每个idv1 的唯一值并将它们存储在变量n 中。然后,如果n <= 1n >= 2,我想从列表中删除数据框。

id v1 v2 
1  2  3
1  2  5
2  9  8
2  4  5
3  7  8
3  1  5

这是我尝试过的:

dat  <- list()
dat2 <- list()
for (i in seq_along(unique(mat$id))){
  dat[[i]] <- data.frame(subset(mat,mat$id==unique(mat$id)[i])) 
  dat[[i]]$n <- length(unique(dat[[i]]$v1))
  if(dat[[i]]$n >= 2){
    dat2[[i]] <- dat[[i]]
  }
}

非常感谢任何帮助!

【问题讨论】:

  • 抱歉,我不明白您要对列表和数据框做什么。这是一个简单的方法来查找每个 id 的唯一 v1 值。 tapply(mat[,"v1"],mat[,"id"],unique)
  • 或唯一值的计数。 tapply(mat[,"v1"],mat[,"id"],function(x) length(unique(x)))。您可能想重新表述您的问题并使用dput 来分享您的数据(我假设mat 是一个矩阵,但我们现在无法确定)。
  • 非常感谢。实际上,我的计划是对列表中的每个数据框进行一些分析。这就是我将mat 子集化的原因。 mat 是一个巧合。我的意思是数据框,而不是矩阵。但是第一个数据框(id = 1)应该从unique(v1) = 1开始删除。

标签: r dataframe for-loop


【解决方案1】:

就个人而言,我会选择dplyr 方法

library(dplyr)
df <- data.frame(id = c(1,1,2,2,3,3),
                 v1 = c(2,2,9,4,7,1),
                 v2 = c(3,5,8,5,8,5))
df_n <- df %>%
    group_by(id) %>% #groups the data by a variable
    summarise(n = length(unique(v1))) %>% #does a computation for each group
    filter(n >=2) #subsets based on condition
df_n
## A tibble: 2 x 2
#     id     n
#  <dbl> <int>
#1     2     2
#2     3     2

现在,如果您想从df 中删除保留在df_n 中的任何数据,您可以使用anti_join

anti_join(df, df_n, by = "id") #
#  id v1 v2
#1  1  2  3
#2  1  2  5

如果您想保留留在df_n 中的ids,您可以使用相反的semi_join

semi_join(df, df_n, by = "id")
#  id v1 v2
#1  2  9  8
#2  2  4  5
#3  3  7  8
#4  3  1  5

编辑

如果要添加新列,请将summarize 替换为mutate。这些函数之间的区别在于mutate 将返回带有新计算表达式的数据框,而summarize 将返回一个行数等于分组组合数的数据框。

看到您的评论后,下面的代码应该可以让您大部分时间到达那里,在这种情况下您可能不需要semi/anti_join。使用filter 将数据框拆分为您喜欢的方式。

library(dplyr)
df <- data.frame(id = c(1,1,2,2,3,3),
                 v1 = c(2,2,9,4,7,1),
                 v2 = c(3,5,8,5,8,5)) %>%
  group_by(id) %>%
  mutate(n = length(unique(v1))

【讨论】:

  • 非常感谢。我正在寻找最后一个。是否可以在semi_join(df, df_n, by = "id") 中添加n 作为附加列。这意味着对于相同的idn 也是相同的。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多