R:基于匹配表对列求和,合并列名

R:基于匹配表对列求和,合并列名,r,R,我有这样一个数据框(字母是列名): 我想根据这个匹配表对列进行求和: a A b B c C 同时合并列名,以便得到以下结果: a/A b/B c/C 9 8 10 9 8 10 9 8 10 9 8 10 请记住,该解决方案需要适用于大型数据帧,因此我无法手动指定新列名 非常感谢 这里有一种方法 df <- data.frame(a=c(1,1,1,1),b=c(2,2,2,2),c=c(3,3,3,3),B=c(6,6,6,6),C=c(

我有这样一个数据框(字母是列名):

我想根据这个匹配表对列进行求和:

a   A
b   B
c   C
同时合并列名,以便得到以下结果:

a/A b/B c/C
9   8   10
9   8   10
9   8   10
9   8   10
请记住,该解决方案需要适用于大型数据帧,因此我无法手动指定新列名


非常感谢

这里有一种方法

df <- data.frame(a=c(1,1,1,1),b=c(2,2,2,2),c=c(3,3,3,3),B=c(6,6,6,6),C=c(7,7,7,7),A=c(8,8,8,8))
matchtab <- data.frame(V1=c("a","b","c"),V2=c("A","B","C"),stringsAsFactors = FALSE)

df2 <- do.call(cbind,lapply(seq_len(nrow(matchtab)),function(i) 
                           data.frame(df[,matchtab$V1[i]]+df[,matchtab$V2[i]])))
names(df2) <- paste0(matchtab$V1,"/",matchtab$V2)

df2
  a/A b/B c/C
1   9   8  10
2   9   8  10
3   9   8  10
4   9   8  10

df这里有一种方法

df <- data.frame(a=c(1,1,1,1),b=c(2,2,2,2),c=c(3,3,3,3),B=c(6,6,6,6),C=c(7,7,7,7),A=c(8,8,8,8))
matchtab <- data.frame(V1=c("a","b","c"),V2=c("A","B","C"),stringsAsFactors = FALSE)

df2 <- do.call(cbind,lapply(seq_len(nrow(matchtab)),function(i) 
                           data.frame(df[,matchtab$V1[i]]+df[,matchtab$V2[i]])))
names(df2) <- paste0(matchtab$V1,"/",matchtab$V2)

df2
  a/A b/B c/C
1   9   8  10
2   9   8  10
3   9   8  10
4   9   8  10
像这样的东西

df <- data.frame(a = rep(1, 5), b = rep(2, 5), c = rep(3, 5), 
                 A = rep(8, 5), C = rep(7, 5), B = rep(6, 5))

df.names <- data.frame(First = c("a", "b", "c"), Second =  c("A", "B", "C"))

apply(df.names, MAR = 1, FUN = function(mynames, mydf) rowSums(df[,colnames(df) %in% mynames]), mydf = df)
像这样的

df <- data.frame(a = rep(1, 5), b = rep(2, 5), c = rep(3, 5), 
                 A = rep(8, 5), C = rep(7, 5), B = rep(6, 5))

df.names <- data.frame(First = c("a", "b", "c"), Second =  c("A", "B", "C"))

apply(df.names, MAR = 1, FUN = function(mynames, mydf) rowSums(df[,colnames(df) %in% mynames]), mydf = df)
您可以这样做:

res <- apply(df.match, 1, function(x) rowSums(df[,c(x[1], x[2])]))
colnames(res) <- paste0(df.match[,1], "/", df.match[,2])

#     a/A    b/B   c/C
#[1,]    9    8   10
#[2,]    9    8   10
#[3,]    9    8   10
#[4,]    9    8   10
#[5,]    9    8   10
res您可以这样做:

res <- apply(df.match, 1, function(x) rowSums(df[,c(x[1], x[2])]))
colnames(res) <- paste0(df.match[,1], "/", df.match[,2])

#     a/A    b/B   c/C
#[1,]    9    8   10
#[2,]    9    8   10
#[3,]    9    8   10
#[4,]    9    8   10
#[5,]    9    8   10

res基本上包括使用
match
几次。使用@Lyngbakr的数据

#DATA
df = structure(list(a = c(1, 1, 1, 1, 1), b = c(2, 2, 2, 2, 2), c = c(3, 
3, 3, 3, 3), A = c(8, 8, 8, 8, 8), C = c(7, 7, 7, 7, 7), B = c(6, 
6, 6, 6, 6)), .Names = c("a", "b", "c", "A", "C", "B"), row.names = c(NA, 
-5L), class = "data.frame")
df.names = structure(list(First = c("a", "b", "c"), Second = c("A", "B", 
"C")), .Names = c("First", "Second"), row.names = c(NA, -3L), class = "data.frame")

toadd = which(colnames(df) %in% df.names[,1])
addto = match(df.names[,2][match(colnames(df)[toadd], df.names[,1])], colnames(df))
setNames(object = df[,addto] + df[,toadd], nm = paste(colnames(df)[toadd], colnames(df)[addto], sep = "/"))
#  a/A b/B c/C
#1   9   8  10
#2   9   8  10
#3   9   8  10
#4   9   8  10
#5   9   8  10

基本上包括使用
match
几次。使用@Lyngbakr的数据

#DATA
df = structure(list(a = c(1, 1, 1, 1, 1), b = c(2, 2, 2, 2, 2), c = c(3, 
3, 3, 3, 3), A = c(8, 8, 8, 8, 8), C = c(7, 7, 7, 7, 7), B = c(6, 
6, 6, 6, 6)), .Names = c("a", "b", "c", "A", "C", "B"), row.names = c(NA, 
-5L), class = "data.frame")
df.names = structure(list(First = c("a", "b", "c"), Second = c("A", "B", 
"C")), .Names = c("First", "Second"), row.names = c(NA, -3L), class = "data.frame")

toadd = which(colnames(df) %in% df.names[,1])
addto = match(df.names[,2][match(colnames(df)[toadd], df.names[,1])], colnames(df))
setNames(object = df[,addto] + df[,toadd], nm = paste(colnames(df)[toadd], colnames(df)[addto], sep = "/"))
#  a/A b/B c/C
#1   9   8  10
#2   9   8  10
#3   9   8  10
#4   9   8  10
#5   9   8  10

是的,但是最后的行名称必须考虑到我的示例中的原始行名称是的,但是最后的行名称必须考虑到我的示例中的原始行名称有效,但是最后的行名称必须考虑到我的示例中的原始行名称太棒了!选择这一行作为答案是因为它在我看来是最简洁的。这是可行的,但最后的行名称必须考虑到原始的行名称,就像我的示例中一样。太棒了!选择这个作为答案是因为我认为它是最简洁的。