簡體   English   中英

如何在R中執行Ifelse函數

[英]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))

我想制作一個新變量,以使新變量具有TrPc的平均值,或者如果它不具有任何值N/ATrPc的數值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM