【问题标题】:how to use gather() in a for loop in R如何在R的for循环中使用gather()
【发布时间】:2016-04-08 17:55:39
【问题描述】:

我有一个包含 72 列的大数据集,我想将每 3 列收集到一个新列中,最终得到 24 列。

我尝试使用 gather() 函数,但它只能在一次 t=i.e. 上运行良好,一次只能收集 ​​3 列。

我可以在 for 循环中使用这个函数吗?

我试过了:

j=0
k=1
l=2
for (i in 2:24){
  neww <- gather(columns, "KEy", "Proteins H/L", c((i+j), (i+k), (i+l)), na.rm = TRUE)
  j=j+2;
  k=k+2;
  l=l+2;
}

我需要将前 3 列收集到一个列中,然后将接下来的 3 列收集到另一列中,依此类推。

【问题讨论】:

  • 请提供一个可重现的例子。 gather() 函数不是基础 R 的一部分。它来自什么包?您是在附加列以使 data.frame 的长度增加 3 倍,还是将列粘贴在一起?没有更多信息,将很难为您提供帮助。
  • 如果你使用 SE 版本gather_,你可以遍历列名,你可以将它作为字符串传递。
  • 使用 tidyr stackoverflow.com/q/25925556/5249203 收集多组列你检查了吗?它没有解决您的类似问题吗?可能重复?
  • gather() 来自 tidyr 包。很抱歉之前没有提到这一点
  • 是的,我已经检查过了:stackoverflow.com/q/25925556/5249203 但在我的情况下,列没有相似的名称,它们都从相同的字符串开始,所以我必须使用列号

标签: r multiple-columns tidyr


【解决方案1】:

您可以为此目的使用sjmisc-package 中的to_long 函数。这个函数是一个方便的for循环,它会调用多个gather()

# create sample
mydat <- data.frame(age = c(20, 30, 40),
                    sex = c("Female", "Male", "Male"),
                    score_t1 = c(30, 35, 32),
                    score_t2 = c(33, 34, 37),
                    score_t3 = c(36, 35, 38),
                    speed_t1 = c(2, 3, 1),
                    speed_t2 = c(3, 4, 5),
                    speed_t3 = c(1, 8, 6))

# check tidyr. score is gathered, however, speed is not
tidyr::gather(mydat, "time", "score", score_t1, score_t2, score_t3)

>   age    sex speed_t1 speed_t2 speed_t3     time score
> 1  20 Female        2        3        1 score_t1    30
> 2  30   Male        3        4        8 score_t1    35
> 3  40   Male        1        5        6 score_t1    32
> 4  20 Female        2        3        1 score_t2    33
> 5  30   Male        3        4        8 score_t2    34
> 6  40   Male        1        5        6 score_t2    37
> 7  20 Female        2        3        1 score_t3    36
> 8  30   Male        3        4        8 score_t3    35
> 9  40   Male        1        5        6 score_t3    38

# gather multiple columns. both time and speed are gathered.
to_long(mydat, "time", c("score", "speed"),
        c("score_t1", "score_t2", "score_t3"),
        c("speed_t1", "speed_t2", "speed_t3"))

>     age    sex     time score speed
>   (dbl) (fctr)    (chr) (dbl) (dbl)
> 1    20 Female score_t1    30     2
> 2    30   Male score_t1    35     3
> 3    40   Male score_t1    32     1
> 4    20 Female score_t2    33     3
> 5    30   Male score_t2    34     4
> 6    40   Male score_t2    37     5
> 7    20 Female score_t3    36     1
> 8    30   Male score_t3    35     8
> 9    40   Male score_t3    38     6

在这种情况下,time 向量(表示收集的组)仅采用多个收集的列名称之一。如果这太令人困惑,您也可以只为 ID 变量编号:

to_long(mydat, "time", c("score", "speed"),
        c("score_t1", "score_t2", "score_t3"),
        c("speed_t1", "speed_t2", "speed_t3"),
        recode.key = TRUE)

>     age    sex  time score speed
>   (dbl) (fctr) (dbl) (dbl) (dbl)
> 1    20 Female     1    30     2
> 2    30   Male     1    35     3
> 3    40   Male     1    32     1
> 4    20 Female     2    33     3
> 5    30   Male     2    34     4
> 6    40   Male     2    37     5
> 7    20 Female     3    36     1
> 8    30   Male     3    35     8
> 9    40   Male     3    38     6

更多示例请参见?to_long

我不确定,但我想我在 GitHub 上读到了一些内容,即“多列收集”也计划在某个时候用于 tidyr...

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2017-06-08
    • 2016-07-26
    • 2017-01-09
    相关资源
    最近更新 更多