r - 将函数应用于跨数据帧行的单个单元格

时间:2014-10-22 12:32:10

标签: r

我的数据包含在数据框中排列的个体患者(每个患者由一行代表)进行的系列温度测量:

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

1 个答案:

答案 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