【问题标题】:Using lapply and the ifelse function in R在 R 中使用 lapply 和 ifelse 函数
【发布时间】:2017-09-01 16:56:57
【问题描述】:

我在 R 中遇到了一个问题,我可以在列表中的元素上运行 ifelse 语句,但是一旦我将 ifelse 语句放在 lapply 函数中,它就不再起作用了。

这是我的例子。我正在处理三个数据框的列表:

> dflist
[[1]]
  ID1 tID1
1  m1    1
2  m2    2
3  m3    3
4  m4    4
5  m5    5

[[2]]
  ID2 tID2
1  m7    7
2  m8    8
3  m9    9
4 m10   10
5 m11   11

[[3]]
  ID3 tID3
1 m13   13
2 m14   14
3 m15   15
4 m16   16
5 m17   17
6 m18   18

如果数据框的行数为奇数,我希望 R 将其标记为“奇数”。如果数据帧的行数是偶数,我只希望 R 输出相同的数据帧。我希望输出是一个列表。

这在我编写独立的 ifelse 语句时有效:

> ifelse(nrow(dflist[[1]])%%2==!0, "ODD", dflist[1])
[1] "ODD"

> ifelse(nrow(dflist[[3]])%%2==!0, "ODD", dflist[3])
[[1]]
  ID3 tID3
1 m13   13
2 m14   14
3 m15   15
4 m16   16
5 m17   17
6 m18   18

但是当我将它放入 lapply 语句时,我会收到一条错误消息。

> lapply(dflist, function(x) ifelse(nrow(dflist[[x]])%%2==!0, "ODD", dflist[x]))

 Error in dflist[[x]] : invalid subscript type 'list' 
> 

关于为什么会发生这种情况以及如何解决它的任何想法?谢谢

【问题讨论】:

  • 你是想给它命名吗?
  • 我认为你的本意是lapply(seq_along(dflist), ...)
  • @akrun - 效果很好。谢谢!我不知道怎么做,但我很高兴它做到了。
  • @dcoss 原因是您正在检查 nrow 是奇数还是偶数,并且该逻辑条件的输出长度为 1。对于这些情况,可以使用 if/elseifelse在长度大于1时使用。

标签: r list if-statement dataframe lapply


【解决方案1】:

如果我们需要返回“ODD”或数据集,请使用if/else

lapply(dflist, function(x) if(nrow(x)%%2==1) "ODD" else x)

数据

dflist <- list(data.frame(col1 = 1:3, col2=4:6), data.frame(col1=1:4, col2=5:8))

【讨论】:

    【解决方案2】:

    当您使用 lapply 时,您只需引用匿名函数的参数,而不是您的原始列表名称。所以不要这样做:

      lapply(dflist, function(x) ifelse(nrow(dflist[[x]])%%2==!0, "ODD", dflist[x]))
    

    您只需要更改以引用您放入函数中的列表项,即“x”;所以应该是:

     lapply(dflist, function(x) ifelse(nrow(x)%%2==!0, "ODD", x))
    

    【讨论】:

    • 好的,除了输出有点奇怪之外,它大部分都有效:它输出为列表中的列表,这没什么大不了的。但是在数据帧有偶数行的情况下,它只需要返回相同的数据帧,它只返回该数据帧的第一列作为具有多个级别的向量
    • 那么如果你只是想识别具有偶数行的数据帧,为什么不直接使用过滤器过滤器(函数(x){nrow(x)%%2 = = 0}, dflist)
    猜你喜欢
    • 2021-10-18
    • 2013-02-14
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多