当0是行中的唯一值时,将0转换为NAs。使用R保留所有其他0

时间:2017-05-10 16:10:32

标签: r na

我有一个数据框'animals':

void ElecClock::qt_static_metacall(QObject *_o, QMetaObject::Call _c,int _id, void **_a)
{
    if (_c == QMetaObject::InvokeMetaMethod) {
        ElecClock *_t = static_cast<ElecClock *>(_o); // this line
        Q_UNUSED(_t)
        switch (_id) {
        case 0: _t->showTime(); break;
        default: ;
        }
    }
    Q_UNUSED(_a);
}

我想将仅包含零的行中的零转换为NA,但保留其他零。我可以这样做:

       ID A B C D
1    Bear 1 1 1 0
2   Tiger 0 0 0 0
3   Horse 1 0 1 0
4  Badger 0 0 0 1
5  Rabbit 1 1 0 1
6   Otter 0 0 0 0
7 Peacock 1 0 0 0

要获得这个:

    animals$Result = rowSums(animals[2:ncol(animals)])

    df = data.frame()

    for(row in 1:nrow(animals)) {
      row = as.data.frame(animals[row,])
      if(row$Result == 0){
        row[2:5] = NA
      }
      df = rbind(df,row)
      print(row)}

df$Result = NULL

但是,我觉得应该有一种更简单的方法来做到这一点。在那儿?谢谢!

2 个答案:

答案 0 :(得分:3)

我们可以在没有循环的情况下通过创建逻辑向量来实现这一点,该逻辑向量基于使用rowSums计算每行的0的数量。基于该子集,没有第一列的数据集,并将满足条件的行分配给NA

df1[!rowSums(df1[-1]!=0), -1] <- NA
df1
#       ID  A  B  C  D
#1    Bear  1  1  1  0
#2   Tiger NA NA NA NA
#3   Horse  1  0  1  0
#4  Badger  0  0  0  1
#5  Rabbit  1  1  0  1
#6   Otter NA NA NA NA
#7 Peacock  1  0  0  0

答案 1 :(得分:0)

这是第二个基本R方法,它使用Reduce查找要设置为NA的行,然后使用lapply循环变量,replace执行替换工作。

# find rows to set to NA
nas <- !Reduce("|", df[-1])
# run through relevant variables, setting desired elements to NA
df[-1] <- lapply(df[-1], replace, nas, NA)

返回

df
       ID  A  B  C  D
1    Bear  1  1  1  0
2   Tiger NA NA NA NA
3   Horse  1  0  1  0
4  Badger  0  0  0  1
5  Rabbit  1  1  0  1
6   Otter NA NA NA NA
7 Peacock  1  0  0  0