在特定值标准之后替换数据帧的行中的值

时间:2014-05-23 16:10:33

标签: r

大家好我想用R中的数据框解决一个小问题。我有一个这种风格的数据框(我在最后部分添加了dput()版本):

  ID x1 x2 x3 x4 x5
1 ab  F  F  G  G  G
2 an  A  B  F  G  G
3 am  B  B  B  C  B
4 ap  F  F  F  F  F
5 aq  A  B  C  F  G

我正在尝试构建一个应用于每一行的函数。此函数标识一行中的任何FF位置后的值将填充F。我想得到这样的东西:

  ID x1 x2 x3 x4 x5
1 ab  F  F  F  F  F
2 an  A  B  F  F  F
3 am  B  B  B  C  B
4 ap  F  F  F  F  F
5 aq  A  B  C  F  F

例如,在第一行中,您可以看到此行有3 F,在最后F之后,所有元素都填充了G。对于具有任何F的其他行,也会发生相同的情况。对于我来说,使用索引是如此复杂,我尝试使用if这样的解决方案:

Base[-1] <- t(apply(
  Base[-1],
  1,
  function(x) {
    if("F" %in% x) {
      x[which.max(x=="F"):length(x)]="F" 
      } else
      x
  }
))

我得到的结果不正确:

  ID x1 x2 x3 x4 x5
1 ab  F  F  B  F  F
2 an  F  F  B  F  F
3 am  F  F  B  F  F
4 ap  F  F  C  F  F
5 aq  F  F  B  F  F

我的数据框dput()的{​​{1}}版本是下一个:

Base

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

你非常接近 which.max(x =='F')正在查看0和1的向量而不是索引号

Base <- structure(list(ID = c("ab", "an", "am", "ap", "aq"), x1 = c("F", 
  "A", "B", "F", "A"), x2 = c("F", "B", "B", "F", "B"), x3 = c("G", 
  "F", "B", "F", "C"), x4 = c("G", "G", "C", "F", "F"), x5 = c("G", 
  "G", "B", "F", "G")), .Names = c("ID", "x1", "x2", "x3", "x4", 
  "x5"), row.names = c(NA, -5L), class = "data.frame")

Base[-1] <- t(apply(
    Base[-1],
    1,
    function(x) {
      if("F" %in% x) {
        x[max(which(x=="F")):length(x)]="F" 
        }
      x }
    ))

应该有效

Base
  ID x1 x2 x3 x4 x5
1 ab  F  F  F  F  F
2 an  A  B  F  F  F
3 am  B  B  B  C  B
4 ap  F  F  F  F  F
5 aq  A  B  C  F  F