我的数据包含在数据框中排列的个体患者(每个患者由一行代表)进行的系列温度测量:
df<-data.frame(H0=c(35.4, 36.0, 36.0, 36.4), H1=c(NA, 34.0, 33.4, NA),
H2=c(NA, 33.5, NA, 34.2), H3=c(32.9, NA, 34.0, NA),
H4=c(NA, 33.1, NA, NA), H5=c(33.2, NA, NA, 32.8))
目标温度为33.0。我写了一个简单的函数,它返回每个测量值与目标温度的差异:
sumfun<-function(x) {
if (x>=33 & !is.na(x)) {
x-33
} else if (x<33 & !is.na(x)) {
33-x
} else {
0
}
}
在控制台中按预期工作。
我想要实现的是数据帧末尾的一列,其中包含每位患者的过冲/下冲测量值之和。
df$cumushoot<-rowSums(df[,1:6]-33, na.rm=TRUE)
接近我想要的,除了我想添加(不减去)下冲值。因此,对于我想要2.6的第一位患者,返回2.5。如果我尝试:
df$cumushoot1<-rowSums(sumfun(df[,1:6]))
返回:
Warning message:
In if (x >= 33 & !is.na(x)) { :
the condition has length > 1 and only the first element will be used
答案 0 :(得分:3)
这可能是一种可能性。 - 33
在整个数据框中循环使用,您可以获取差异的绝对值(abs
),并对每一行求和:
df$dif <- rowSums(abs(df - 33), na.rm = TRUE)
# H0 H1 H2 H3 H4 H5 dif
# 1 35.4 NA NA 32.9 NA 33.2 2.7
# 2 36.0 34.0 33.5 NA 33.1 NA 4.6
# 3 36.0 33.4 NA 34.0 NA NA 4.4
# 4 36.4 NA 34.2 NA NA 32.8 4.8