【问题标题】:Converting wide table to long programmatically在R中以编程方式将宽表转换为长表
【发布时间】:2022-09-29 21:54:04
【问题描述】:

我的示例数据集很宽,包含以下值:

    olddata_wide <- read.table(header=TRUE, text=\'
 subject sex a b c a1 b1 c1  a2 b2 c2 
       1   M     7.9  12.3  10.7 7.5  12.1  10.3 8.1  12.5  10.9
       2   F     6.3  10.6  11.1 6.0  10.4  11.0 6.5  10.9  11.4
       3   F     9.5  13.1  13.8 9.3  13.0  13.5 9.8  13.5  13.9
       4   M    11.5  13.4  12.9 11.2  13.5  12.7 11.7  13.6  13.9
\')

我想将其转换为长数据集。问题是我想同时使用多个 keycols - 我希望列 a & b & c 成为一个名为 value 的长列,以及列 a1 和 @987654327 @ & c1value1a2 & b2 & c2value3。所以期望的结果是:

    subject sex value valueType value1 valueType1 value2 valueType2
 1:       1   M   7.9         a    7.5         a1    8.1         a2
 2:       2   F   6.3         a    6.0         a1    6.5         a2
 3:       3   F   9.5         a    9.3         a1    9.8         a2
 4:       4   M  11.5         a   11.2         a1   11.7         a2
 5:       1   M  12.3         b   12.1         b1   12.5         b2
 6:       2   F  10.6         b   10.4         b1   10.9         b2
 7:       3   F  13.1         b   13.0         b1   13.5         b2
 8:       4   M  13.4         b   13.5         b1   13.6         b2
 9:       1   M  10.7         c   10.3         c1   10.9         c2
10:       2   F  11.1         c   11.0         c1   11.4         c2
11:       3   F  13.8         c   13.5         c1   13.9         c2
12:       4   M  12.9         c   12.7         c1   13.9         c2

我知道如何得到想要的结果以编程方式为了关键列:

keycol <- \"valueType\"
valuecol <- \"value\"
gathercols <- c(\"a\", \"b\", \"c\")

gather_(olddata_wide, keycol, valuecol, gathercols)

但是如何同时为多个 keycols 执行此操作?

  • 我认为这里的问题是列名不一致:第一组列是c(\"a\", \"b\", \"c\")(没有尾随数字),而其他列有一个尾随数字(例如c(\"a1\", \"b1\", \"c1\"))。将三个 pivot_longer 调用汇总到一个函数中是否适合您的需要?您是否总是有三组 \"a\"、\"b\"、\"c\" 列,其名称与示例数据中给出的名称相同?

标签: r data.table tidyr gather mutate


【解决方案1】:

有不同的解决方案。如果您的列的名称不遵循特定模式,那么我会使用 sjmisc 包。

    sjmisc::reshape_longer(
    olddata_wide ,
    columns = list(
    c("a", "b", "c"),
    c("a1", "b1", "c1"),
    c("a2", "b2", "c2")),
    values.to = c("value", "value1", "value2"))

【讨论】:

  • 不幸的是,我无法安装该软件包(公司政策),还有什么选择?
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多