合并序列文件中的行

时间:2014-07-03 15:19:38

标签: r

我有一个数据框,其中每个人都有两行,我想将这两行合并到一行。

代码行:

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

我该怎么做?

2 个答案:

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

如果您的数据是长格式,请使用aggregatesubstr(以及其他选项)来获取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"