如何在R中的for循环中使用gather()

如何在R中的for循环中使用gather(),r,multiple-columns,tidyr,R,Multiple Columns,Tidyr,我有一个72列的大数据集,我想把每3列收集到一个新的列中,最后得到24列 我试着使用gather()函数,但它只在t=时工作一次,也就是说,它一次只收集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; }

我有一个72列的大数据集,我想把每3列收集到一个新的列中,最后得到24列

我试着使用
gather()
函数,但它只在t=时工作一次,也就是说,它一次只收集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;
}
j=0
k=1
l=2
(我在2:24){

新的为此,您可以使用来自的
to_long
函数。此函数是一个方便的for循环,它调用多个
聚集()
调用

# 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
有关更多示例,请参见
?to_long


我不确定,但我想我在GitHub上读到了一些关于tidyr somewhen也计划进行“多列收集”的信息。

请给出一个可复制的示例。
gather()
函数不是base R的一部分。它来自哪个软件包?是添加列以生成3倍长的data.frame,还是将列粘贴在一起?如果没有更多信息,将很难为您提供帮助。如果您使用SE版本的
聚集
,您可以迭代列名,并将其作为s传递使用tidyr收集多组列您是否检查了此项?它是否解决了类似的问题?可能重复?Gather()来自包tidyr.soryy,因为之前没有提到是的,我已经检查过了:stackoverflow.com/q/25925556/5249203,但在我的例子中,列没有类似的名称,所有名称都是从同一个字符串开始的,所以我必须使用列号
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