2016-07-19 101 views
-1

我有以下DF:怎麼辦Ifelse功能中的R

df1 = data.frame(ID=c(1121, 13345, 2234, 9954, 0092), Tr=c(3.2, "N/A", 3.3, 2.5, "N/A"), 
       Pc=c(3.0, "N/A", 4.0, 2.5, "N/A"), TrPc=c("N/A", 3.8, "N/A", "N/A", 2.8)) 

我想提出一個新的變量,新的變量要麼有TrPc平均,或者如果它不有任何值N/A它把數字值TrPc。我正在考慮做一個ifelse函數,但我不知道如何去做。

ID Tr Pc TrPc Avg 
1 1121 3.2 3.0 N/A 3.1 
2 13345 N/A N/A 3.8 3.8 
3 2234 3.3 4.0 N/A 3.65 
4 9954 2.5 2.5 N/A 2.5 
5 0092 N/A N/A 2.8 2.8 
+0

當例如'Pc'和'TrPc'有一個數值並且'Tr'是'NA'時,你想要做什麼? – Jaap

+0

(Tr == NA或Pc == NA)意味着(TrPc是Avg值) – snoram

+0

@ProcrastinatusMaximus然後我想只保留TrPc等級 – LordVoldemort

回答

2

我們可以轉換factornumeric

df1[-1] <- lapply(df1[-1], function(x) as.numeric(as.character(x))) 
df1$Avg <- rowMeans(df1[-1], na.rm=TRUE) 
df1$Avg 
#[1] 3.10 3.80 3.65 2.50 2.80 

還是其他選項後使用rowMeans如果我們需要用 「TRPC」 列比較

pmax(rowMeans(df1[c("Tr", "Pc")], na.rm=TRUE), df1$TrPc, na.rm=TRUE) 
#[1] 3.10 3.80 3.65 2.50 2.80 
3

rowMeans是一個更具計算效率的解決方案。但是,如果你有興趣在ifelse解決方案:

with(df1, ifelse(is.na(Tr) | is.na(Pc), TrPc, (Tr + Pc)/2)) 
[1] 3.10 3.80 3.65 2.50 2.80 

我包括with,以減少重複添加data.frame名。

數據

df1 = data.frame(ID=c(1121, 13345, 2234, 9954, 0092), 
       Tr=c(3.2, NA, 3.3, 2.5, NA), 
       Pc=c(3.0, NA, 4.0, 2.5, NA), 
       TrPc=c(NA, 3.8, NA, NA, 2.8)) 
+0

第一個ID的意思是什麼,不是3.10而是9.6 ? – LordVoldemort

1

不依賴於是否功能的解決方案。

# turn numeric for calculations 
df1$Tr <- as.numeric(as.character(df1$Tr)) 
df1$Pc <- as.numeric(as.character(df1$Pc)) 
df1$TrPc <- as.numeric(as.character(df1$TrPc)) 

# generate new variable, and replace as requested 
df1$Avg <- 0 
sum.has.value <- !is.na(df1$Tr + df1$Pc) 
df1$Avg[sum.has.value] <- (df1$Tr[sum.has.value] + df1$Pc[sum.has.value])/2 
df1$Avg[!sum.has.value] <- df1$TrPc[!sum.has.value] 

# Results in: 
# df1$Avg 
# [1] 3.10 3.80 3.65 2.50 2.80