【问题标题】:r - apply function to individual cells across rows of a dataframer - 将函数应用于数据框行中的单个单元格
【发布时间】:2014-12-17 21:46:05
【问题描述】:

我的数据包含在数据框中排列的单个患者(每个患者由一行表示)的串行温度测量:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    这可能是一种可能性。 - 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2015-09-13
      • 2021-03-28
      • 1970-01-01
      • 2022-07-13
      • 2017-01-21
      • 1970-01-01
      相关资源
      最近更新 更多