【问题标题】:Combining variables in wide format in R在R中组合宽格式的变量
【发布时间】:2017-10-06 04:32:06
【问题描述】:

我目前有一个宽格式数据框,其中包含干预前和干预后的问卷分数。有 848 名患者至少有一份问卷。我想查看数据以比较分数从干预前到干预后的变化情况。但是,我很苦恼,因为这些数据是宽格式的,而且就每位患者的问卷数量而言,数据并不统一。有一个变量列出了问卷的实例,问卷的值是另一个变量。

这是它当前外观的示例:

a=c('instance1','total1','instance2', 'total2', 'instance3', 'total3', 
'instance4','total4', 'instance5','total5')
b=c('postop2', '5', 'postop1', '7', NA, NA, 'preop', '10', NA, NA)
c=c(NA, NA, 'preop', '3', NA, NA, 'postop1', '4', 'postop2', '3')
data.frame(rbind(a,b,c))

问卷数据共有848行。

我需要计算术前和术后问卷的差异。重组这些数据以便获得这些值的最佳方法是什么?我正在苦苦挣扎,因为所有 848 名患者之间的实例并不一致。

感谢您的帮助。

【问题讨论】:

  • 如果您查看您的示例,我假设列名将是第一行而不是“X1”、“X2”等。
  • 是的,列名是第一行

标签: r dataframe


【解决方案1】:

不确定这是否是你所追求的,但试试这个 data.table 方法:

library(data.table)

DT <- data.table(rbind(b,c))
names(DT) <- a

DT2 <- melt(DT, measure = patterns("^instance", "^total"), value.name = c("instance", "total"))

DT2

    variable instance total
 1:        1  postop2     5
 2:        1       NA    NA
 3:        2  postop1     7
 4:        2    preop     3
 5:        3       NA    NA
 6:        3       NA    NA
 7:        4    preop    10
 8:        4  postop1     4
 9:        5       NA    NA
10:        5  postop2     3

编辑:

如果你想要一个摘要,你也可以这样做:

DT2$total <- as.numeric(DT2$total)  # for some reason total is class character

DT2[, sum(total), by=instance]

   instance V1
1:  postop2  8
2:       NA NA
3:  postop1 11
4:    preop 13

【讨论】:

  • Jeppe,这适用于样本数据。但是,当我将它应用到我的数据时,它只会获取一些实例的总数,所以当我去计算平均值时,它只返回平均值,例如“NA”和“postop2”。这可能是融入长格式的问题吗?任何关于从哪里开始寻找的建议将不胜感激。谢谢。
  • 可能是因为您的数据集中存在 NA。试试 DT2
  • 我试过了,但它忽略了整个数据框/数据表。
  • 当我去计算平均值时,它给了我大多数输出​​的 NaN,当我知道 Pre-Op 实例有“总”分数时 1 Post-Op 1 NaN 2 Post-Op 2 NaN 3手术后 3 NaN 4 手术后 4 + 16.0000 5 手术前 NaN 6 14.2414
  • 这可能是由许多不同的原因造成的。你能举一个可重现的例子吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多