我有一个2列的df。我需要在Col3中组合Col1和Col2 - 由“>”分隔的替代文本A1-B1; A2-B2; A3-B3; ...
实施例
| Col1 | Col2 | Col3 |
| abcd > de > efg | ppppp > ppt > pp | abcd-ppppp > de-ppt > efg-pp |
| hij > kl > iiii | aaa > bbb > hhh | hij-aaa > kl-bbb > iiii-hhh |
| aa | fff | aa-fff |
| a > bbb | pp > a | a-pp > bbb-a |
...
如何在R编程中执行此操作? 感谢
答案 0 :(得分:0)
这是一个难以解决的问题。在未来,为了我们的理智,请考虑如何输出数据。如果生成数据,您可以轻松解决这个问题,您可以考虑进行下游分析。无论如何,这里的解决方案就足够了。
让我们生成您的数据:
li:before {
counter-increment: li;
content: counter(item, decimal-leading-zero);
}
接下来使用Col1 <- c("abcd > de > efg", "hij > kl > iiii", "aa", "a > bbb")
Col2 <- c("ppppp > ppt > pp", "aaa > bbb > hhh", "fff", "pp > a")
dat <- data.frame(Col1, Col2, stringsAsFactors = FALSE)
我们剥离,分隔并展平apply
和Col1
并添加第一个分隔符Col2
:
-
下一部分非常困难,经过大量谷歌搜索后,我找到了一个解决方案(一个黑客),用数字向量分割字符列表。
l1 <- apply(dat, 2, function(x) trimws(unlist(strsplit(x, split = ">"))))
l2 <- apply(l1, 1, function(x) paste0(x[1], "-", x[2]))
按“&gt;”的出现拆分#thanks: https://techoverflow.net/2012/11/10/r-count-occurrences-of-character-in-string/
#gets occurrences of ">" for later use
countCharOccurrences <- function(char, s) {
s2 <- gsub(char,"",s)
return (nchar(s) - nchar(s2))
}
o <- countCharOccurrences(">", dat$Col1)+1
df <- as.data.frame(l2, stringsAsFactors = FALSE)
(即df
)的值:
o
最后,我们会折叠数据框列表并添加最终分隔符# Thanks to this SO answer:
# https://stackoverflow.com/questions/27132290/split-dataframe-by-row-number-in-r
l2a <- split(df, cumsum(c(TRUE,(1:nrow(df) %in% cumsum(o))[-nrow(df)])))
:
>
然后与您的起始数据帧结合使用:
l3 <- lapply(l2a, function(x) paste(x[,1], collapse = " > "))
多田!
编辑:我忘记了dat$Col3 <- l3
Col1 Col2 Col3
1 abcd > de > efg ppppp > ppt > pp abcd-ppppp > de-ppt > efg-pp
2 hij > kl > iiii aaa > bbb > hhh hij-aaa > kl-bbb > iiii-hhh
3 aa fff aa-fff
4 a > bbb pp > a a-pp > bbb-a
是一个对象列表。您需要使用l3
将它们展平为:
unlist