在R中使用lapply和ifelse函数

5

我在使用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”。如果数据框中行数为偶数,则只需输出相同的数据框。我希望输出结果是一个列表。
在编写独立的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' 
> 

有什么想法可以解决这个问题吗?谢谢。

你是不是打算给它命名? - akrun
我认为你的意思是要做 lapply(seq_along(dflist), ...) - Shape
@akrun - 那个完美地运行了。谢谢!我不确定是怎么做到的,但我很高兴它能够成功。 - dcossyleon
@dcoss的原因是你在检查nrow是奇数还是偶数,该逻辑条件的输出长度为1。 对于这些情况,可以使用if/else。 当长度大于1时,使用ifelse - akrun
2个回答

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

3

当你使用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
好的,那基本上可以工作了,只是输出有点奇怪:它输出为一个列表中的列表,这并不是什么大问题。但是在数据框具有偶数行的情况下,它只需要返回相同的数据框,但它却将该数据框的第一列作为一个具有许多级别的向量返回。 - dcossyleon
那么,如果您只想识别行数为偶数的数据框,为什么不使用Filter函数的过滤方式呢?具体做法是:Filter(function(x){nrow(x)%%2 == 0},dflist)。 - SolomonRoberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接