将长数据转换为宽数据并计算R中的和

将长数据转换为宽数据并计算R中的和,r,reshape,tidyr,R,Reshape,Tidyr,如何将长数据重塑为宽数据 x = c('x1','x1','x2','x2') y = c('y1','y1','y2','y2') z= c('a','b','a','b') n = c(3,5,7,2) df1 <- data.table(x,y,z,n) > df1 x y z n 1: x1 y1 a 3 2: x1 y1 b 5 3: x2 y2 a 7 4: x2 y2 b 2 我试着玩了重塑和dcast,但对我没有帮助 dcast(df1, x ~

如何将长数据重塑为宽数据

x = c('x1','x1','x2','x2')
y  = c('y1','y1','y2','y2')
z= c('a','b','a','b')
n = c(3,5,7,2)
df1 <- data.table(x,y,z,n)
    > df1
    x  y z n
1: x1 y1 a 3
2: x1 y1 b 5
3: x2 y2 a 7
4: x2 y2 b 2
我试着玩了重塑和dcast,但对我没有帮助

dcast(df1, x ~ y, value.var="value")

我不清楚为什么需要z,z.1和z.2。在输出表中,在上述所需的输出示例中,它向您提供了哪些信息

我这里的解决方案可能会有所帮助,它还捕获z值,为您提供关于哪个值具有id
a
或id
b

df1 <- data.table(x,y,z,n)
df1$id <- c(as.factor(df1$z)) # create an id on z, so that you can capture the info

   x  y z n id
1: x1 y1 a 3  1
2: x1 y1 b 5  2
3: x2 y2 a 7  1
4: x2 y2 b 2  2

# reshape with the id var to wide format 
dt <- reshape(df1,timevar= "id", idvar = c("x","y"), direction="wide")

    x  y z.1 n.1 z.2 n.2
1: x1 y1   a   3   b   5
2: x2 y2   a   7   b   2

# finally do a rowsums
dt[, Sum := rowSums(.SD, na.rm = TRUE), .SDcols = grep("n", names(dt))] 
dt
    x  y z.1 n.1 z.2 n.2 Sum
1: x1 y1   a   3   b   5   8
2: x2 y2   a   7   b   2   9

df1我不清楚为什么需要z,以及z.1和z.2。在输出表中,在上述所需的输出示例中,它向您提供了哪些信息

我这里的解决方案可能会有所帮助,它还捕获z值,为您提供关于哪个值具有id
a
或id
b

df1 <- data.table(x,y,z,n)
df1$id <- c(as.factor(df1$z)) # create an id on z, so that you can capture the info

   x  y z n id
1: x1 y1 a 3  1
2: x1 y1 b 5  2
3: x2 y2 a 7  1
4: x2 y2 b 2  2

# reshape with the id var to wide format 
dt <- reshape(df1,timevar= "id", idvar = c("x","y"), direction="wide")

    x  y z.1 n.1 z.2 n.2
1: x1 y1   a   3   b   5
2: x2 y2   a   7   b   2

# finally do a rowsums
dt[, Sum := rowSums(.SD, na.rm = TRUE), .SDcols = grep("n", names(dt))] 
dt
    x  y z.1 n.1 z.2 n.2 Sum
1: x1 y1   a   3   b   5   8
2: x2 y2   a   7   b   2   9

df1这里是一个使用tidyr的解决方案

x = c('x1','x1','x2','x2')
y  = c('y1','y1','y2','y2')
z= c('a','b','a','b')
n = c(3,5,7,2)
df <- data.frame(x,y,z,n)

library(tidyr)
library(dplyr)

answer<-df %>% group_by(x, y) %>% mutate(n=sum(n))  %>% 
  unite(title, -3) %>% spread(z, z) %>% separate( title, into=c("x", "y", "n"))

# x     y     n     a     b    
# <chr> <chr> <chr> <fct> <fct>
# 1 x1    y1    8     a     b    
# 2 x2    y2    9     a     b   
x=c('x1','x1','x2','x2'))
y=c('y1','y1','y2','y2')
z=c('a'、'b'、'a'、'b')
n=c(3,5,7,2)
df%变异(n=总和(n))%>%
联合(标题,-3)%%>%排列(z,z)%%>%分开(标题,分为=c(“x”,“y”,“n”))
#x y n a b
#     
#1 x1 y1 8 a b
#2 x2 y2 9 a b

我允许读者将这些列调整为所需的格式,这是一项附加工作。

这里有一个tidyr解决方案

x = c('x1','x1','x2','x2')
y  = c('y1','y1','y2','y2')
z= c('a','b','a','b')
n = c(3,5,7,2)
df <- data.frame(x,y,z,n)

library(tidyr)
library(dplyr)

answer<-df %>% group_by(x, y) %>% mutate(n=sum(n))  %>% 
  unite(title, -3) %>% spread(z, z) %>% separate( title, into=c("x", "y", "n"))

# x     y     n     a     b    
# <chr> <chr> <chr> <fct> <fct>
# 1 x1    y1    8     a     b    
# 2 x2    y2    9     a     b   
x=c('x1','x1','x2','x2'))
y=c('y1','y1','y2','y2')
z=c('a'、'b'、'a'、'b')
n=c(3,5,7,2)
df%变异(n=总和(n))%>%
联合(标题,-3)%%>%排列(z,z)%%>%分开(标题,分为=c(“x”,“y”,“n”))
#x y n a b
#     
#1 x1 y1 8 a b
#2 x2 y2 9 a b

我允许读者将这些列调整为所需的格式,这是一项附加工作。

只是为了向锅中加入另一个选项(并非我认为其他解决方案不合适)。我认为这种方法简单直观

df1 <- data.frame(x,y,z,n)

data.frame(c(aggregate(n ~ x+y, sum, data=df1),
             aggregate(z ~ x+y, unique, data=df1)[3]))


#   x  y n z.1 z.2
# 1 x1 y1 8   a   b
# 2 x2 y2 9   a   b

df1只是为了把另一个选项扔进锅里(我并不认为其他解决方案不合适)。我认为这种方法简单直观

df1 <- data.frame(x,y,z,n)

data.frame(c(aggregate(n ~ x+y, sum, data=df1),
             aggregate(z ~ x+y, unique, data=df1)[3]))


#   x  y n z.1 z.2
# 1 x1 y1 8   a   b
# 2 x2 y2 9   a   b

df1我可以推荐一个tidyverse解决方案吗?我可以推荐一个tidyverse解决方案吗?您的解决方案更适合我的情况,因为我现在记得我希望n列作为单独的行以及它的总和。。干杯,谢谢你在不知不觉中给出了这个解决方案。你的解决方案更适合我的情况,因为我现在记得我想要n列作为单独的行以及它的总和。。谢谢你在不知不觉中给出了解决方案。