【问题标题】:Check list in data.frame contains elementdata.frame 中的检查列表包含元素
【发布时间】:2016-09-16 09:49:28
【问题描述】:

我有一个 data.frame,其中一列是一个列表(参见 post)我想检查 data.frame 中的哪些列表包含一个元素(比如说数字 3)目前,我正在循环通过data.frame的所有行。

df=data.frame(a=1:3,b=I(list(1,3:7,1:3)))
df
for(i in 1:nrow(df)){
     print(3 %in% df$b[[i]])

}

有没有更优雅的方式?

【问题讨论】:

  • 你可以使用 apply(df, 1, function(x) 3 %in% unlist(x[2])) 也可以循环,但也许是“优雅的”。
  • 我会选择 mapply(`%in%`, 3, df$b)sapply(df$b, function(x) 3 %in% x) 或类似的东西
  • 那肯定更优雅。我之前没有使用过mapply。非常好。
  • 如果您有一个可行的解决方案,但想知道什么会更好,那么这是 Code Review 而不是 StackOverflow 的问题。

标签: r list dataframe


【解决方案1】:

我个人喜欢用map来解决这样的问题,更多信息可以找到here

library(purrr)
df %>% transpose() %>% map(2) %>% map((function(x) 3 %in% x))

给出:

[[1]]
[1] FALSE

[[2]]
[1] TRUE

[[3]]
[1] TRUE

另外,还有map_lgl,它返回一个逻辑数组而不是一个列表。

df %>% transpose() %>% map(2) %>% map_lgl((function(x) 3 %in% x))

给:

[1] FALSE  TRUE  TRUE

【讨论】:

    【解决方案2】:

    是的,试试这个:

    3 %in% unlist(df$b)
    

    结果:

    > 3 %in% unlist(df$b)
    [1] TRUE
    

    Unlist(df$b) 将 df$b 的所有元素连接成一个向量。

    如果你有多个列:

    > apply(df,2,function(x) 3 %in% unlist(x))
       a    b 
    TRUE TRUE 
    

    【讨论】:

    • 我猜他们正在逐行查找结果(对于“b”列)。您的解决方案仅说明 3 是否出现在列中的任何地方
    • 是的,他们正在寻找专门针对“b”列的结果。我知道多列的第二个解决方案在列中的任何位置查找 3,无论该列是否包含列表。他必须先对列进行子集化。
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2017-11-20
    • 2014-04-30
    相关资源
    最近更新 更多