我有一个数据框,其中每个人都有两行,我想将这两行合并到一行。
代码行:
dat <- read.table("cbin.csv",sep="\t", row.names=1)
dat
V2 V3 V4 V5
1_1 A B C D
1_2 a b c d
2_1 E F G H
2_2 e f g h
3_1 J K L M
3_2 j k l m
d <- apply( dat[ , colnames(dat) ] , 2 , paste , collapse = " " )
d
V2 V3 V4 V5
"A a E e J j" "B b F f K k" "C c G g L l" "D d H h M m"
但是我想像这样结合每两行
1 A a B b C c D d
2 E e F f G g H h
3 I i J j K k L l
我该怎么做?
答案 0 :(得分:0)
这将使您或多或少地得到您想要的data.frame。我只是将偶数行和cbind
拉出到奇数行旁边。
dat2 <- cbind(dat[seq(1, nrow(dat), by = 2), ],
dat[seq(2, nrow(dat), by = 2), ])
我将重新排序列(或将它们粘贴在一起,如果你想将它们组合成单独的字符串)作为读者的练习。
答案 1 :(得分:0)
以下是几个选项:
选项1:使用stack
获取较长的data.frame
,然后在paste
中使用aggregate
获取所需的输出。
在这里,你如何制作你的&#34; long&#34; data.frame
。
Long <- cbind(rn = rownames(dat), stack(dat))
head(Long)
# rn values ind
# 1 1_1 A V2
# 2 1_2 a V2
# 3 2_1 E V2
# 4 2_2 e V2
# 5 3_1 J V2
# 6 3_2 j V2
如果&#34; dat&#34;中的值是factor
,您可能需要这样做:
Long <- cbind(rn = rownames(dat), stack(lapply(dat, as.character)))
如果您的数据是长格式,请使用aggregate
和substr
(以及其他选项)来获取paste
所需的值。
aggregate(values ~ substr(rn, 1, 1), Long, paste, collapse = " ")
# substr(rn, 1, 1) values
# 1 1 A a B b C c D d
# 2 2 E e F f G g H h
# 3 3 J j K k L l M m
另一种选择是与@Gregor建议的类似方法。这基本上是获取每个备用行并绑定它的另一种方法,但是需要额外的步骤来重新排序和粘贴这些值。
do.call(paste,
cbind(dat[c(TRUE, FALSE), ],
dat[c(FALSE, TRUE), ])[order(rep(names(dat), 2))])
# [1] "A a B b C c D d" "E e F f G g H h" "J j K k L l M m"