Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将dplyr中的一组列除以(并命名)另一组列_R_Dplyr - Fatal编程技术网

将dplyr中的一组列除以(并命名)另一组列

将dplyr中的一组列除以(并命名)另一组列,r,dplyr,R,Dplyr,经过(非常可怕的)dplyr管道之后,我得到了如下数据集: year A B C [....] Z count.A count.B count.C [....] count.Z 1999 10 20 10 ... 6 3 5 67 ... 6 2000 3 5 5 ... 7 5 2 5 ...

经过(非常可怕的)dplyr管道之后,我得到了如下数据集:

year   A    B     C  [....] Z  count.A    count.B     count.C [....] count.Z
1999  10    20    10  ...   6      3          5           67    ...      6
2000   3    5      5  ...   7      5          2            5    ...      5
要复制的一些示例数据:

df <- data.frame(year = c(1999, 2000), 
                 A = c(10, 20), 
                 B = c(3, 6), 
                 C = c(1, 2), 
                 count.A = c(1, 2), 
                 count.B = c(8, 9), 
                 count.C = c(5, 7))

我必须以编程的方式这样做,因为我有数百列。在dplyr管道中有这样做的方法吗?

假设您可以通过编程方式创建一个包含所有列名的向量,下面是我在上面的示例中的做法

for (c.name in c("A", "B", "C")) {
    c.weight <- sprintf("weight.%s", c.name)
    c.count <- sprintf("count.%s", c.name)
    df[,c.weight] <- df[,c.name] / df[,c.count]
}
for(c.name在c中(“A”、“B”、“c”)){

c、 权重假设您可以通过编程方式创建包含所有列名的向量,下面是我在上面的示例中的做法

for (c.name in c("A", "B", "C")) {
    c.weight <- sprintf("weight.%s", c.name)
    c.count <- sprintf("count.%s", c.name)
    df[,c.weight] <- df[,c.name] / df[,c.count]
}
for(c.name在c中(“A”、“B”、“c”)){

c、 权重如果列的名称一致(并且很容易检索),则可以使用
lappy

cols <- c("A","B","C")
df[,paste0("weighted.",cols)] <- lapply(cols, function(x) df[,x] / df[, paste0("count.",x)])

#  year  A B C count.A count.B count.C weighted.A weighted.B weighted.C
#1 1999 10 3 1       1       8       5         10  0.3750000  0.2000000
#2 2000 20 6 2       2       9       7         10  0.6666667  0.2857143

cols如果列的名称一致(并且很容易检索),则可以使用
lappy

cols <- c("A","B","C")
df[,paste0("weighted.",cols)] <- lapply(cols, function(x) df[,x] / df[, paste0("count.",x)])

#  year  A B C count.A count.B count.C weighted.A weighted.B weighted.C
#1 1999 10 3 1       1       8       5         10  0.3750000  0.2000000
#2 2000 20 6 2       2       9       7         10  0.6666667  0.2857143

cols不在列名中存储变量。如果您重新调整数据的形状使其整洁,那么计算非常简单:

库(tidyverse)
df%%>%聚集(var,val,-年)%%>%#重塑为长
分离(var,c('var','letter'),fill='left')%>%#从以前的列名称中提取var
mutate(var=coalesce(var,'value'))%>%#为未命名的var添加名称
扩展(var,val)%>%#重新整形回宽
变异(权重=值/计数)#现在这很简单
#>年份字母计数值权重
#>1 1999 A 110.0000000
#>2 1999 B 8 3 0.3750000
#>3 1999 C 5 1 0.2000000
#>420000A20100000000
#>5 2000 B 9 6 0.667
#>6 2000 C 7 2 0.2857143

不要将变量存储在列名中。如果重新调整数据的形状使其整洁,则计算非常简单:

库(tidyverse)
df%%>%聚集(var,val,-年)%%>%#重塑为长
分离(var,c('var','letter'),fill='left')%>%#从以前的列名称中提取var
mutate(var=coalesce(var,'value'))%>%#为未命名的var添加名称
扩展(var,val)%>%#重新整形回宽
变异(权重=值/计数)#现在这很简单
#>年份字母计数值权重
#>1 1999 A 110.0000000
#>2 1999 B 8 3 0.3750000
#>3 1999 C 5 1 0.2000000
#>420000A20100000000
#>5 2000 B 9 6 0.667
#>6 2000 C 7 2 0.2857143

假设列是有序的,我们可以使用
数据.table
。在
.SDcols
中指定感兴趣的列,然后除以数据子集的列子集。table与另一半一起分配(
:=
)给新列

library(data.table)
setDT(df)[, paste0("weighted.",names(df)[1:3]) := .SD[,1:3]/.SD[,4:6], .SDcols = A:count.C]
df
#   year  A B C count.A count.B count.C weighted.year weighted.A weighted.B
#1: 1999 10 3 1       1       8       5            10  0.3750000  0.2000000
#2: 2000 20 6 2       2       9       7            10  0.6666667  0.2857143

假设列是有序的,我们可以使用
data.table
。在
.SDcols
中指定感兴趣的列,并用另一半除以data.table子集的列子集,然后将其分配给新列(
:=

library(data.table)
setDT(df)[, paste0("weighted.",names(df)[1:3]) := .SD[,1:3]/.SD[,4:6], .SDcols = A:count.C]
df
#   year  A B C count.A count.B count.C weighted.year weighted.A weighted.B
#1: 1999 10 3 1       1       8       5            10  0.3750000  0.2000000
#2: 2000 20 6 2       2       9       7            10  0.6666667  0.2857143

这与
行和
有什么关系?您可能应该编辑标题。这与
行和
有什么关系?您可能应该编辑标题。