[英]Pivot rows into a single column and index them using column names in 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
非常感謝!!
這很容易做到與gather
來自tidyr
包:
library(tidyr)
df2 <- gather(df1, id, val)
注意,在提交之后,這需要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 = "_"))
你可以試試
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
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 = "_"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.