如何在R中执行Ifelse功能

时间:2016-07-19 18:39:05

标签: 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的数值。我在考虑做一个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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

rowMeans列转换为factor后,我们可以使用numeric

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

如果我们需要与&#34; TrPc&#34;柱

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

答案 2 :(得分: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