2017-08-04 74 views
3

我的数据集是类似于下面:与NA更换行,如果任何值不积极

df <- data.frame(
    A = c(-1, 2, 3), 
    B = c(1, 1, -1)) 
df 
# A B 
# 1 -1 1 
# 2 2 1 
# 3 3 -1 

我试图得到以下的结果,其中值当两个AB是正不停:

A B 
1 NA NA 
2 2 1 
3 NA NA 

我试过df2 <- apply(df, 1:2, function(x) if (x > 0) x else NA),但是当AB是正值时它会返回值。我如何将第二个条件添加到它?

回答

6

你可以通过使用带值1,如果所有的值都在该行中的正和否则一个向量乘以每列需要值NA:

df * ifelse(rowSums(df <= 0) > 0, NA, 1) 
# A B 
# 1 NA NA 
# 2 2 1 
# 3 NA NA 
+0

这是辉煌!两个问题:1.什么'rowSums(df <= 0)',其中返回'1 0 1',是什么意思? 2.在我的例子中,'df2'的'str'是'num',而你的''data.frame'。如何将其转换为'num'?我需要它来进行下一次计算。 –

+0

@TT 1)'df <= 0'返回一个矩阵,指示'df'中的每个元素是否为非正数,'rowSums'将这些行相加,将'TRUE'转换为1和'FALSE'为0。统计每行中非正数元素的数量。 2)你可以将它封装在'as.matrix'中以将数据框转换为矩阵。 – josliber

2

replicate(NCOL(df), Reduce('|', lapply(df, function(x) x < 0)))可以给其中NA应该被取代的索引。它检查每列中是否至少有一个小于零的值。

replace(df, replicate(NCOL(df), Reduce('|', lapply(df, function(x) x < 0))), NA) 
# A B 
#1 NA NA 
#2 2 1 
#3 NA NA 

或者

df[which(!rowSums(df >= 0) == NCOL(df)),] = NA 
df 
# A B 
#1 NA NA 
#2 2 1 
#3 NA NA 
+1

这是一个很好的解决方案,因为它应该在数据非数字的数据框中正常工作。我的解决方案节省了一些打字的时间,但会打破文本数据。 – josliber