如何基于R中的一行将行转换为列?
我有一个类似这样的数据集如何基于R中的一行将行转换为列?,r,matrix,transform,data-manipulation,data-wrangling,R,Matrix,Transform,Data Manipulation,Data Wrangling,我有一个类似这样的数据集 A B 1960 1970 1980 x a 1 2 3 x b 1.1 2.1 NA y a 2 3 4 y b 1 NA 1 A year a b x 1960 1 1.1 x 1970 2 2.1 x 1980 3 NA y 1960 2 1 y 1970
A B 1960 1970 1980
x a 1 2 3
x b 1.1 2.1 NA
y a 2 3 4
y b 1 NA 1
A year a b
x 1960 1 1.1
x 1970 2 2.1
x 1980 3 NA
y 1960 2 1
y 1970 3 NA
y 1980 4 1
我想基于行B变换列,使其看起来像这样
A B 1960 1970 1980
x a 1 2 3
x b 1.1 2.1 NA
y a 2 3 4
y b 1 NA 1
A year a b
x 1960 1 1.1
x 1970 2 2.1
x 1980 3 NA
y 1960 2 1
y 1970 3 NA
y 1980 4 1
我不知道该怎么做。我知道我可以使用t()或使用tidyverse中的row_to_columns()进行完整转换,但结果不是我想要的。
初始数据在B列中有大约60列和165个不同的值。库(data.table)
dt 2:x 1970 2.1
#>3:x 1980 3 NA
#>4:y 1960 2 1.0
#>5:y 1970 3 NA
#>6:y 1980 4 1.0
由(v0.3.0)基本R解决方案于2020年5月5日创建:
long_df <- reshape(df, direction = "long",
varying = which(!names(df) %in% c("A", "B")),
v.names = "value",
timevar = "year",
times = names(df)[!(names(df) %in% c("A", "B"))],
ids = NULL,
new.row.names = 1:(length(which(!names(df) %in% c("A", "B"))) * nrow(df)))
wide_df <- setNames(reshape(long_df, direction = "wide",
idvar = c("A", "year"),
timevar = "B"), c("A", "B", unique(df$B)))
long\u df您可以先执行pivot\u long()
,然后执行pivot\u wide()
,不过重新命名列“B”可能不是个好主意:
库(dplyr)
图书馆(tidyr)
df%>%pivot_更长(-c(A,B))%>%
pivot\u更宽(名称\u from=B)%>%重命名(B=name)
#一个tibble:6x4
A B A B
1 x 1960 1 1.1
2 x 1970 2.1
3 x 1980 3 NA
4 y 1960 2 1
5 y 1970 3 NA
6 y 1980 4 1
df=结构(列表A=结构c(1L,1L,2L,2L),.Label=c(“x”,
“y”,class=“factor”),B=结构(c(1L,2L,1L,2L),.Label=c(“a”,
“b”),class=“factor”),`1960`=c(1,1.1,2,1),`1970`=c(2,
2.1,3,NA),`1980`=c(3L,NA,4L,1L)),class=“data.frame”,row.names=c(NA,
-(4升)
您能“输出”数据吗?d%>%dplyr::pivot_更长(3:5)
一些列重命名应该可以工作。