Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何基于R中的一行将行转换为列?_R_Matrix_Transform_Data Manipulation_Data Wrangling - Fatal编程技术网

如何基于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)
一些列重命名应该可以工作。