Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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_Dplyr_Tidyverse - Fatal编程技术网

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