将行旋转到单个列中,并使用R中的列名对其进行索引

时间:2014-11-03 19:19:35

标签: r

我需要将行值翻转到单个列中,并根据列名和行号创建索引。我在R中检查了很多枢轴解决方案,但似乎没有简单的翻转而没有创建手段,总和等。帮助将不胜感激。

df1 <- read.table(textConnection("a1,a2,a3
23,34,4
34,44,98"), sep=",", header=TRUE)

df2 <- read.table(textConnection("id,val
1_a1,23
2_a2,34
3_a3,4
4_a1,34
5_a2,44
6_a3,98"), sep=",", header=TRUE)

我需要从这样的数据框出发:

  a1 a2 a3
1 23 34  4
2 34 44 98

对此:

    id val
1 1_a1  23
2 2_a2  34
3 3_a3   4
4 4_a1  34
5 5_a2  44
6 6_a3  98

非常感谢!!

3 个答案:

答案 0 :(得分:2)

可以使用gather包中的tidyr轻松完成此操作:

library(tidyr)
df2 <- gather(df1, id, val)

请注意,这需要在this commit之后使用tidyr的最新开发版本 - 您可以使用devtools::install_github("hadley/tidyr")进行安装。否则,您可以将行更改为gather(df1, id, val, a1:a3)

要添加1_2_等,您可以执行以下操作:

df2$id <- paste(df2$id, 1:nrow(df2), sep = "_")

如果你也使用dplyr包,你可以这样做:

library(dplyr)
library(tidyr)
df2 <- df1 %>% gather(id, val) %>% mutate(id = paste(id, seq_len(n()), sep = "_"))

答案 1 :(得分:1)

你可以尝试

m1 <- t(df1)
d1 <- data.frame(id=paste(seq_along(m1), 
        rownames(m1)[row(m1)], sep="_"), val=c(m1))

 d1
 #   id val
 #1 1_a1  23
 #2 2_a2  34
 #3 3_a3   4
 #4 4_a1  34
 #5 5_a2  44
 #6 6_a3  98

答案 2 :(得分:0)

require(dplyr) # for mutate()
require(tidyr) # for gather()

d <- data.frame(
  a1 = c(23, 34),
  a2 = c(34, 44),
  a3 = c(4, 98)
  )

gather(d, id, val, a1:a3) %>%
  mutate(id = paste(row_number(), "id", sep = "_"))