[英]How to do Ifelse function in R
我有以下df:
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))
我想制作一個新變量,以使新變量具有Tr
和Pc
的平均值,或者如果它不具有任何值N/A
, TrPc
的數值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
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))
在將factor
列轉換為numeric
后,我們可以使用rowMeans
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
如果需要與“ 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
不依賴if函數的解決方案。
# 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.