我有以下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
的数值。我在考虑做一个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 :(得分: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