在R中使用lapply和ifelse函数

时间:2017-04-06 15:04:44

标签: r list if-statement dataframe lapply

我在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将其标记为“ODD”。如果数据帧具有偶数行,我只想让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' 
> 

为什么会发生这种情况以及如何解决这个问题?谢谢

2 个答案:

答案 0 :(得分:1)

当您使用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))

答案 1 :(得分:0)

如果我们需要返回“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))