应用函数组合列

时间:2017-02-07 03:07:33

标签: r function for-loop dataframe apply

我有一个包含许多列的数据框,我想组合从第5列开始的列。我尝试使用apply来执行此操作。

数据框:

1   682333  191.858 191517119   C   A   C   A   A   A   C   A   A   A     A   A
2   1862626 71.9275 56032940    A   C   C   C   A   A   A   C   A   C   A   A
3   11957134    155.78  150230950   B   B   B   B   A   B   A   B   A   B   A   B
4   2516482 51.2692 31496569    B   A   A   A   A   A   A   A   A   A   A   A
5   9378200 51.2798 31572927    A   A   B   B   B   A   A   A   A   A   B   A
6   2071534 52.1573 32824318    A   B   A   B   A   B   A   B   B   B   A   B
7   2074633 33.068  19035920    A   A   B   A   A   A   B   A   B   A   B   A
8   7856856 121.811 117540910   A   A   A   A   A   A   A   A   B   A   B   A
9   3741206 2.18574 2169864 A   A   A   A   A   A   A   A   A   A   A   A
10  4411364 12.5959 24191374    C   C   A   C   A   C   C   C   A   C   A   C

输出:

1   682333  191.858 191517119   CA      CA      AA      CA      AA      AA
2   1862626 71.9275 56032940    AC      CC      AA      AC      AC      AA
3   11957134    155.78  150230950   BB      BB      AB      AB      AB      AB
4   2516482 51.2692 31496569    BA      AA      AA      AA      AA      AA
5   9378200 51.2798 31572927    AA      BB      BA      AA      AA      BA
6   2071534 52.1573 32824318    AB      AB      AB      AB      BB      AB
7   2074633 33.068  19035920    AA      BA      AA      BA      BA      BA
8   7856856 121.811 117540910   AA      AA      AA      AA      BA      BA
9   3741206 2.18574 2169864 AA      AA      AA      AA      AA      AA
10  4411364 12.5959 24191374    CC      AC      AC      CC      AC      AC

我试过这样:

col <- apply(df[,-1:-4], 2, function(x) {paste(x,x+1,sep="")}
df <- cbind(df[,1:4],col)

但是有一个错误:

  

x + 1中的错误:二元运算符的非数字参数。

3 个答案:

答案 0 :(得分:2)

您可以使用 Map 循环奇数位列,甚至将列并行放置并将相应的列粘贴在一起:

as.data.frame(c(df[1:4], Map(function(x, y) paste(x, y, sep = ""), 
                             df[-(1:4)][c(TRUE, FALSE)],      # use cycling rule to pick 
                                                              # odd position columns
                             df[-(1:4)][c(FALSE, TRUE)])))    # pick even position columns

#   V1       V2        V3        V4 V5 V7 V9 V11 V13 V15
#1   1   682333 191.85800 191517119 CA CA AA  CA  AA  AA
#2   2  1862626  71.92750  56032940 AC CC AA  AC  AC  AA
#3   3 11957134 155.78000 150230950 BB BB AB  AB  AB  AB
#4   4  2516482  51.26920  31496569 BA AA AA  AA  AA  AA
#5   5  9378200  51.27980  31572927 AA BB BA  AA  AA  BA
#6   6  2071534  52.15730  32824318 AB AB AB  AB  BB  AB
#7   7  2074633  33.06800  19035920 AA BA AA  BA  BA  BA
#8   8  7856856 121.81100 117540910 AA AA AA  AA  BA  BA
#9   9  3741206   2.18574   2169864 AA AA AA  AA  AA  AA
#10 10  4411364  12.59590  24191374 CC AC AC  CC  AC  AC

答案 1 :(得分:1)

一种方法是从头开始用每对列的cbind替换数据帧的奇数列。然后,删除原始偶数列。

for (i in seq(1,ncol(df)-1,2) {
    df[, i] <- cbind(df[, i], df[, i+1])
}

df <- df[, seq(1,ncol(df),2)]

请注意,如果发生,上面的第二个赋值将在数据帧的末尾保留一个不匹配的奇数列。例如,如果输入数据框有5列,我们会合并1:23:4,第五列将保持不变。

答案 2 :(得分:1)

我们可以通过使用paste从第5列开始对交替列进行子集,seq列,将同等大小的矩阵转换为matrixpaste,分配输出返回列数的一半,对所选列进行子集以创建新数据集

df1[5:10] <- paste(as.matrix(df1[seq(5, ncol(df1), by = 2)]), 
         as.matrix(df1[seq(6, ncol(df1), by = 2)]), sep="")
df2 <- df1[1:10]