R:如何用不同的标题和/或数据帧的溢出部分连接数据帧的部分,续

问题描述 投票:0回答:1

我有一个程序的输出,就像这样。

 Keg     tar   tar   jar    jar  EA_A   EA_D   EA_E  EA_G
 123F    0       1   0       0   0       0     0     0
 134E    0       0   0       0   0       1     1     1
 234B    0       0   0       0   0       0     0     0
 Keg     EA_B
 123F    0
 134E    0
 234B    1
 Keg     tar   tar   jar jar EA_C   EA_D   EA_E
 ABCD    0       1   0   0   0       0     0
 13CD    0       0   0   0   0       1     1
 234F    0       0   0   0   1       0     0
 DCEF    0       0   0   0   0       0     0
 Keg     EA_F
 ABCD    0
 13CD    0
 234F    1
 DCEF    0
 Keg     tar   tar   jar jar   EA_A   EA_D   EA_E   EA_H
 123C    0       1   0   0       0   0       0       0
 134C    0       0   0   0       0   1       1       1
 234C    0       0   0   0       0   0       0       0
 Keg     EA_B
 123C    0
 134C    0
 234C    1

我正在尝试安排输出

 Keg     EA_A   EA_B   EA_C  EA_D   EA_E  EA_F  EA_G   EA_H
 123F    0       0     0     0      0     0     0      0
 134E    0       0     0     1      1     0     1      0
 234B    0       1     0     0      0     0     0      0
 ABCD    0       0     0     0      0     0     0      0
 13CD    0       0     0     1      1     0     0      0
 234F    0       0     1     0      0     1     0      0
 DCEF    0       0     0     0      0     0     0      0
 123C    0       0     0     0      0     0     0      0
 134C    0       0     0     1      1     0     0      1
 234C    0       1     0     0      0     0     0      0

我曾经在这里问了一个非常相似的问题(R:How to attach parts of a data frame with different headers and/or an overflowing piece of the dat frame)并得到了答案。当我尝试将新输出适合旧解决方案时,我得到错误的输出。

我在这里包括了大部分上一篇文章,以使这篇文章自成一体。在我看来,以前的解决方案应该有效,但我不确定我错过了什么。

老帖子:

假设两个连续桶之间的文本作为一个块。

在此示例中,前两个块具有相同的Keg值。实际上文本溢出,导致第二个块具有相同的Keg值。每个新块(不是溢出的块)都有一个列tar。

需要将柱焦油和罐子剥离到最后,如输出所示。列数是有限的,可以假定为(“EA_A”,“EA_B”,“EA_C”,“EA_D”,“EA_E”,“EA_F”,“EA_G”,“EA_H”)。

输出中可以有任意数量的块。任何溢出的块都将在其家族的正下方。数据块将始终具有列名称,这些列名称是有限名称集的一部分。列名不重复。

我们也可以拥有不同列名的数据块。

这是我正在使用的代码(或者我从prev帖子中得到的代码)

nm1 <- c("EA_A", "EA_B", "EA_C", "EA_D", "EA_E", "EA_F", "EA_G","EA_H")
temp = split(df1, cumsum(grepl("[A-Z]", df1$tar))) %>%
  map(~ if(any(grepl("[A-Z]", .$tar))) { 
    names(.) <- unlist(.[1,])
    .[-1,]
  } else .) %>% 
  map(~ .[names(.) != ""]) %>% 
  bind_rows %>%
  group_by(Keg) %>%
  summarise_at(vars(intersect(nm1, names(.))), funs(sum(as.numeric(.),
  na.rm = TRUE)))                                                                                       
r dataframe
1个回答
0
投票

Okie。想出这个。我所要做的就是改变grep以忽略大小写。

nm1 <- c("EA_A", "EA_B", "EA_C", "EA_D", "EA_E", "EA_F", "EA_G","EA_H")
temp = split(df1, cumsum(grepl("[A-Z]", df1$tar, ignore.case = TRUE))) %>%
  map(~ if(any(grepl("[A-Z]", .$tar, ignore.case = TRUE))) { 
    names(.) <- unlist(.[1,])
    .[-1,]
  } else .) %>% 
  map(~ .[names(.) != ""]) %>% 
  bind_rows %>%
  group_by(Keg) %>%
  summarise_at(vars(intersect(nm1, names(.))), funs(sum(as.numeric(.),
  na.rm = TRUE)))                                                                                       
© www.soinside.com 2019 - 2024. All rights reserved.