2017-08-04 35 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