我有一个程序的输出,就像这样。
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)))
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)))