使用包含变量名称的向量创建新列

3

我有一个数据和一个向量包含变量名称,我想创建一个新的变量,其中包含向量中变量的行总和,并且我希望新变量的名称(向量中变量的总和)是变量名称的串联。

例如,我有这个数据:

> data
Name      A    B    C    D    E
r1        1    5    12  21    15
r2        2    4     7  10     9
r3        5   15     6   9     6
r4        7    8     0   7    18

这个向量。
>Vec

"A" , "C" , "D"

我想要的结果是变量A、C和D的总和,我的变量名为ACD。

这里是我想要的结果:

 > data
    Name      A    B    C    D   ACD    E
    r1        1    5    12  21    34   15
    r2        2    4     7  10    18    9
    r3        5   15     6   9    20    6
    r4        7    8     0   7    14   18

我尝试了这个:
data <- cbind(data , as.data.frame(rowSums(data[,Vec]) ))

但是我不知道如何创建名称

这是我得到的结果

 >data
    
       Name       A    B    C    D     E  rowSums(data[,Vec])
        r1        1    5    12  21    15    34
        r2        2    4     7  10     9    18
        r3        5   15     6   9     6    20
        r4        7    8     0   7    18    14

这只是一个样例来解释我的意图。

我想将旧数据的影响赋予新数据(包含新变量),就像我在上面的命令中做的那样。

编辑1: 在我的真实程序中,我不知道向量中的元素名称(我的变量名称),所以我不能像Pax建议的那样执行data $ ACD <- cbind(data,as.data.frame(rowSums(data [,Vec])))。实际上,我有一个for循环来生成我的向量,并且每次都创建一个变量来放置我想要的结果(向量中变量的总和),因此我不知道如何在不知道向量元素的情况下分配名称。

请告诉我如果您需要更多的澄清或信息。

谢谢。


尝试使用 data$ACD <- cbind(data , as.data.frame(rowSums(data[,Vec]) ))。在我看来,你的计算是错误的,例如对于 r1 而言,1+12+21为33而不是34。 - user14692575
谢谢您的评论,问题是我不知道元素(我的向量中变量的名称),我刚刚编辑了问题以使其更清晰,同时感谢您的纠正。 - Reda
2个回答

1

这不是一个一行解决方案,但你可以在下一行上设置名称:

data <- data.frame(A = c(1, 2, 5, 7), 
                   B = c(5, 4, 15, 8), 
                   C = c(12, 7, 6, 0), 
                   D = c(21, 10, 9, 7), 
                   E = c(15, 9, 6, 18))
Vec <- c("A" , "C" , "D")

data <- cbind(data, rowSums(data[,Vec]))

# Add name
names(data)[ncol(data)] <- paste(Vec, collapse="")


#   A  B  C  D  E ACD
# 1 1  5 12 21 15  34
# 2 2  4  7 10  9  19
# 3 5 15  6  9  6  20
# 4 7  8  0  7 18  14

1

这里有一个使用 janitor 包的选项。您可以使用 adorn_totals,它会将总行或总列附加到数据框中。在本例中,name 参数包括新列的名称,最后的 Vec 包括要求和的列。

library(janitor)

adorn_totals(data, "col", fill = NA, na.rm = TRUE, name = paste(Vec, collapse = ""), all_of(Vec))

输出

 A  B  C  D  E ACD
 1  5 12 21 15  34
 2  4  7 10  9  19
 5 15  6  9  6  20
 7  8  0  7 18  14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接