R 数据帧长到宽格式
给定以下数据帧R 数据帧长到宽格式,r,dplyr,tidyverse,R,Dplyr,Tidyverse,给定以下数据帧 df <- structure(list(Group = c("A", "A", "B", "B", "C", "C", "D", "D", "E", "E"), TEST_A = c("neg", "neg", "neg&
df <- structure(list(Group = c("A", "A", "B", "B", "C", "C", "D", "D",
"E", "E"), TEST_A = c("neg", "neg", "neg", "neg", "neg", "neg",
"neg", "pos", "pos", "neg"), TEST_B = c("neg", "neg", "neg",
"neg", "neg", "neg", "neg", "neg", "neg", "neg"), RESULT_NOW = c(0L,
0L, 0L, NA, 0L, 0L, 0L, 0L, 0L, 0L), RESULTS_BEFORE = c(0L, 0L,
0L, NA, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 10L), class = "data.frame")
我想创建以下数据框:
Group TEST_A_1 TEST_A_2 TEST_B_1 TEST_B_1 RESULT_NOW_1 RESULT_NOW_2 RESULTS_BEFORE_1 RESULTS_BEFORE_2
A neg neg neg neg 0 0 0 0
B neg neg neg neg 0 NA 0 NA
C neg neg neg neg 0 0 0 0
...
E pos neg neg neg 0 0 0 0
所以实际上是使用Group列将dataframe移动到宽格式。请注意,“组”列每个组最多可以包含4行。在这个例子中,每组只有两行
谢谢您的帮助。您可以尝试以下方法:
library(tidyverse)
library(reshape2)
#Melt
df2 <- reshape2::melt(df,id.vars = "Group")
df2 %>% group_by(Group,variable) %>%mutate(index=1:length(variable),variable=paste0(variable,'.',index)) %>%
select(-index) -> df2
#Pivot
df2 %>%
group_by(variable) %>%
mutate(row = row_number()) %>%
pivot_wider(id_cols = c(row, Group),
names_from = variable,
values_from = c(value)) %>%
select(-row)
# A tibble: 5 x 9
Group TEST_A.1 TEST_A.2 TEST_B.1 TEST_B.2 RESULT_NOW.1 RESULT_NOW.2 RESULTS_BEFORE.1 RESULTS_BEFORE.2
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 A neg neg neg neg 0 0 0 0
2 B neg neg neg neg 0 <NA> 0 <NA>
3 C neg neg neg neg 0 0 0 0
4 D neg pos neg neg 0 0 0 0
5 E pos neg neg neg 0 0 0 0
我希望这能对您有所帮助。诀窍是首先添加一个id列。在第二步中,我们可以简单地将tidyr::pivot_应用得更广泛,以实现所需的结果: df% 组\按组%>% mutateid=行数组%>% 解组%>% pivot\u widernames\u from=id,value\u from=cTEST\u A,TEST\u B,RESULT\u NOW,RESULTS\u BEFORE >一个tibble:5x9 >分组测试\u A\u 1测试\u A\u 2测试\u B\u 1测试\u B\u 2结果\u现在\u 1结果\u现在\u 2 > >1负负负负负负0 >2 B负负负负负0 NA >3 C负负负负负0 >4 D负位置负0 0 0 >5东正负负负0 0 > ... 还有两个变量:结果在结果1之前,结果在结果2之前
我找不到答案。我不确定这是同一个问题。在链接的帖子中,新列将从现有的单个列中拾取。或者,至少我不知道该怎么办。是我的错。这并不意味着坏。尚未意识到您缺少id列,无法使其成为pivot_wider的简单应用程序。如果您有无法手动管理的测试,或者您想为以后的添加做好准备,您也可以使用tidyselect助手,该助手也会加载tidyr包->pivot_wider[…],value_from=cstarts_,带有'TEST_',RESULT_NOW,之前的结果
library(tidyverse)
library(reshape2)
#Melt
df2 <- reshape2::melt(df,id.vars = "Group")
df2 %>% group_by(Group,variable) %>%mutate(index=1:length(variable),variable=paste0(variable,'.',index)) %>%
select(-index) -> df2
#Pivot
df2 %>%
group_by(variable) %>%
mutate(row = row_number()) %>%
pivot_wider(id_cols = c(row, Group),
names_from = variable,
values_from = c(value)) %>%
select(-row)
# A tibble: 5 x 9
Group TEST_A.1 TEST_A.2 TEST_B.1 TEST_B.2 RESULT_NOW.1 RESULT_NOW.2 RESULTS_BEFORE.1 RESULTS_BEFORE.2
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 A neg neg neg neg 0 0 0 0
2 B neg neg neg neg 0 <NA> 0 <NA>
3 C neg neg neg neg 0 0 0 0
4 D neg pos neg neg 0 0 0 0
5 E pos neg neg neg 0 0 0 0