【问题标题】:R:How to attach parts of a data frame with different headers and/or an overflowing piece of the dat frame, ContR:如何附加具有不同标题和/或数据帧溢出部分的数据帧部分,续
【发布时间】:2017-12-31 03:58:58
【问题描述】:

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

 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 列。

列 tar 和 jar 需要在最后被剥离,如输出所示。列数是有限的,可以假设为(“EA_A”、“EA_B”、“EA_C”、“EA_D”、“EA_E”、“EA_F”、“EA_G”、“EA_H”)。

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

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

这是我正在使用的代码(或者我从上一篇文章中得到的)

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)))                                                                                       

【问题讨论】:

  • 试图弄清楚我需要在代码中更改什么以使其正常工作。很确定我的理解是这里的问题。 @akrun
  • 有什么想法吗? @akrun

标签: r dataframe


【解决方案1】:

好的。想通了。我所要做的就是将 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)))                                                                                       

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多