【问题标题】:tidyr::gather multiple columns of varying typestidyr::gather 多列不同类型
【发布时间】:2017-03-06 20:41:29
【问题描述】:

我的问题类似于this question。我正在尝试tidyr::gather 多列。但是,链接中提供的解决方案不太理想,因为所有列的属性通常不相同,因此它们被删除。

注意,我知道如何使用 base R 来执行此操作,但我正在尝试学习如何使用 tidyr 和/或 dplyr 执行等效操作。

在下面,我模拟了一些数据(虽然效果不佳,但速度很快),这些数据说明了我经常遇到的情况(尽管我通常有更多的列遵循同样的模式)。我用stats::reshape 提供了基本解决方案,所以你可以看到我想要的输出。

任何帮助将不胜感激。

set.seed(123)
male_g6 <- rbinom(100, 1, .5)
ell_g6 <- rbinom(100, 1, .1)
sped_g6 <- rbinom(100, 1, .15)
pullouts_g6 <- rbinom(100, 5, .1)
disability_g6 <- replicate(100, 
                sample(
                    c("asd", "cd", "ed", "hi", "id", "ohi", "ld", "none"),
                    1,
                    prob = c(rep(0.01, 6), 0.05, 0.89)
                    )
                 )
score_g6 <- rnorm(100, 200, 10)
score_g7 <- score_g6 + 5 + rnorm(100, 0, 2)
score_g8 <- score_g7 + 5 + rnorm(100, 0, 2)

d <- data.frame(
        SID = 1:100,
        male_g6 = male_g6,
        male_g7 = male_g6,
        male_g8 = male_g6,
        ell_g6 = ell_g6,
        ell_g7 = ell_g6,
        ell_g8 = ell_g6,
        sped_g6 = sped_g6,
        sped_g7 = sped_g6,
        sped_g8 = sped_g6,
        pullouts_g6 = pullouts_g6,
        pullouts_g7 = pullouts_g6,
        pullouts_g8 = pullouts_g6,
        disability_g6 = disability_g6,
        disability_g7 = disability_g6,
        disability_g8 = disability_g6,
        score_g6 = score_g6,
        score_g7 = score_g7,
        score_g8 = score_g8
    )

基础重塑

ld <- stats::reshape(d,
        idvar = "SID",
        varying = list(
            c("male_g6", "male_g7", "male_g8"),
            c("ell_g6", "ell_g7", "ell_g8"),
            c("sped_g6", "sped_g7", "sped_g8"),
            c("pullouts_g6", "pullouts_g7", "pullouts_g8"),
            c("disability_g6", "disability_g7", "disability_g8"),
            c("score_g6", "score_g7", "score_g8")
            ),
        v.names = c("male", "ell", "sped", "pullouts", "disability", "score"),
        times = 6:8,
        timevar = "Grade",
        direction = "long"
    )
ld <- ld[order(ld$SID), ]

【问题讨论】:

  • 顺便说一句,基本的 R 重塑可以极大地简化 - reshape(d, idvar="SID", direction="long", varying=2:19, sep="_g", timevar="Grade") - reshape 如果你指定一个合适的 sep= ,就会对变量名称和时间进行一些神奇的猜测
  • 当然。我主要只是想提供一个我想要的输出的例子。我倾向于出于习惯将它们全部命名,因为变量通常无处不在,并且并不总是具有一致的名称。但这确实更简单,我喜欢在你的建议中使用sep

标签: r dplyr tidyr tidyverse


【解决方案1】:

您需要收集超出您想要结束的内容,以便您可以将年级与标题分开,之后您可以展开回宽格式:

ld2 <- d %>% gather(var, val, -SID) %>%     # gather to long form
    # separate grade from variable names
    separate(var, c('var', 'grade'), sep = '_g', convert = TRUE) %>% 
    spread(var, val, convert = TRUE)    # spread back to wide

head(ld2)

##   SID grade disability ell male pullouts    score sped
## 1   1     6         cd   0    0        1 196.2440    0
## 2   1     7         cd   0    0        1 203.2739    0
## 3   1     8         cd   0    0        1 211.1347    0
## 4   2     6       none   0    1        0 194.3812    1
## 5   2     7       none   0    1        0 195.3957    1
## 6   2     8       none   0    1        0 202.4890    1

【讨论】:

  • 完美!我不知道convert = TRUE 选项。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 2018-06-24
  • 2015-06-08
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多