应用函数来组合列
Apply function to combine columns
我有一个包含许多列的数据框,我想合并从第 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)
但是出现错误:
Error in x + 1 : non-numeric argument to binary operator.
一种方法是从头开始用每对列的 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:2
和 3:4
,第五列将保持不变。
您可以使用 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
我们可以通过使用 seq
从第 5 列开始对交替列进行子集化来 paste
列,转换为 matrix
,paste
将大小相同的矩阵放在一起,分配输出回到列数的一半,对所选列进行子集以创建新数据集
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]
我有一个包含许多列的数据框,我想合并从第 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)
但是出现错误:
Error in x + 1 : non-numeric argument to binary operator.
一种方法是从头开始用每对列的 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:2
和 3:4
,第五列将保持不变。
您可以使用 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
我们可以通过使用 seq
从第 5 列开始对交替列进行子集化来 paste
列,转换为 matrix
,paste
将大小相同的矩阵放在一起,分配输出回到列数的一半,对所选列进行子集以创建新数据集
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]