如何通过 R 中选定的列值转置 table?
How can I transpose my table by selected column values in R?
我在 R 工作。
如何转置我的 table 由客户创建新列。这些行将由 idMarket 和部分组成,其他列将给出每个客户在这些市场和部分中的分数。
idMarket idSection idClient Score %
2 99 23 100 1
2 99 56 25 0,2
3 67 23 56 0,5
3 67 56 50 0,3
预计table:
idMarket idSection Client23 %23 Client56 %56
2 99 100 1 25 0,2
3 67 56 0,5 50 0,3
谢谢!!
pivot_wider(df, c(idMarket, idSection), names_from = idClient, values_from = c(Score, `%`))
# A tibble: 2 x 6
idMarket idSection Score_23 Score_56 `%_23` `%_56`
<int> <int> <int> <int> <dbl> <dbl>
1 2 99 100 25 1 0.2
2 3 67 56 50 0.5 0.3
reshape(df, dir='wide', timevar = 'idClient', idvar = c('idMarket', 'idSection'), sep='_')
idMarket idSection Score_23 %_23 Score_56 %_56
1 2 99 100 1.0 25 0.2
3 3 67 56 0.5 50 0.3
我采用了一种可能效率较低的方式,但我想我会使用 dplyr 和 tidyr 提供替代方案。我所做的是将 Score/% 列聚集在一起,然后使用 Client/% 命名一个新名称,然后根据您的要求广泛传播数据。这不会按照您想要的 table 的确切顺序,但仍会为您提供相同的数据:
library(dplyr)
library(tidyr)
dat<-data.frame("idMarket" = c(2,2,3,3),
"idSection" = c(99, 99, 67, 67),
"idClient" = c(23, 56 ,23, 56),
"Score" = c(100, 25, 56, 50),
"%" = c("1", "0,2", "0,5", "0,3"),
check.names = F, stringsAsFactors = F
)
dat2<-dat%>%
tidyr::gather("key", "value", Score, `%`)%>%
mutate(key = ifelse(key == "Score", paste0("Client", idClient), paste0("%", idClient)))%>%
select(-idClient)%>%
tidyr::spread(key, value)
dat2
idMarket idSection %23 %56 Client23 Client56
1 2 99 1 0,2 100 25
2 3 67 0,5 0,3 56 50
我在 R 工作。 如何转置我的 table 由客户创建新列。这些行将由 idMarket 和部分组成,其他列将给出每个客户在这些市场和部分中的分数。
idMarket idSection idClient Score %
2 99 23 100 1
2 99 56 25 0,2
3 67 23 56 0,5
3 67 56 50 0,3
预计table:
idMarket idSection Client23 %23 Client56 %56
2 99 100 1 25 0,2
3 67 56 0,5 50 0,3
谢谢!!
pivot_wider(df, c(idMarket, idSection), names_from = idClient, values_from = c(Score, `%`))
# A tibble: 2 x 6
idMarket idSection Score_23 Score_56 `%_23` `%_56`
<int> <int> <int> <int> <dbl> <dbl>
1 2 99 100 25 1 0.2
2 3 67 56 50 0.5 0.3
reshape(df, dir='wide', timevar = 'idClient', idvar = c('idMarket', 'idSection'), sep='_')
idMarket idSection Score_23 %_23 Score_56 %_56
1 2 99 100 1.0 25 0.2
3 3 67 56 0.5 50 0.3
我采用了一种可能效率较低的方式,但我想我会使用 dplyr 和 tidyr 提供替代方案。我所做的是将 Score/% 列聚集在一起,然后使用 Client/% 命名一个新名称,然后根据您的要求广泛传播数据。这不会按照您想要的 table 的确切顺序,但仍会为您提供相同的数据:
library(dplyr)
library(tidyr)
dat<-data.frame("idMarket" = c(2,2,3,3),
"idSection" = c(99, 99, 67, 67),
"idClient" = c(23, 56 ,23, 56),
"Score" = c(100, 25, 56, 50),
"%" = c("1", "0,2", "0,5", "0,3"),
check.names = F, stringsAsFactors = F
)
dat2<-dat%>%
tidyr::gather("key", "value", Score, `%`)%>%
mutate(key = ifelse(key == "Score", paste0("Client", idClient), paste0("%", idClient)))%>%
select(-idClient)%>%
tidyr::spread(key, value)
dat2
idMarket idSection %23 %56 Client23 Client56
1 2 99 1 0,2 100 25
2 3 67 0,5 0,3 56 50