我需要将行值翻转到单个列中,并根据列名和行号创建索引。我在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
非常感谢!!
答案 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 = "_"))