我有一个数据框'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
但是,我觉得应该有一种更简单的方法来做到这一点。在那儿?谢谢!
答案 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