将一列的特定行元素乘以同一数据帧内一组列中的每一列

时间:2018-07-16 12:28:30

标签: r function for-loop dplyr data.table

我已经为这个问题苦苦挣扎了一个星期,但我无法为这个问题形成逻辑:

我有以下这种迁移表(或数据透视表):

Region County1 County2 County 3... County 75 Multiplier
County1  0.23    0.56   0.54   ...   0.75     1200
County2  0.54    0.33   0.66   ...   0.66     1321 
...
County75 0.92    0.21   0.12   ...   0.45     1600

我想将乘数的第一行元素乘以第一县列(例如:1200 *(County1))

我正在尝试自动化这样的事情:

Table1$County1 <- Table1$Multiplier[1] * Table1$County1

我一直试图考虑使用循环/函数,dplyr等,但是我无法提出有效的代码/我的逻辑存在严重缺陷。欢迎任何帮助/建议,我一直在搜索Stack Overflow,但我不知道要搜索的内容(或该操作的名称)。如果已经存在类似的解决方案,并且我确实无法找到它,我并不是要引起任何重复:(。

(在excel中,这类似于将$(美元符号)与列名相乘并相乘)

输出应如下所示:

Region County1 County2 ... County 75 Multiplier
County1  276    739.76 ...   1200     1200
County2  648    435.93 ...   1056     1321 
 ...
County75  1104   277.41...   720      1600

谢谢!

2 个答案:

答案 0 :(得分:3)

这是一个tidyverse解决方案:

library(tidyverse)
df1 <- select(df,Region1 = Region,Multiplier)
df2 <- select(df,-Multiplier) %>% gather(Region1,value,-Region)
inner_join(df1,df2,by="Region1") %>%
  mutate(value = Multiplier * value) %>%
  select(-Multiplier) %>%
  spread(Region1,value)

#     Region County1 County2 County75
# 1  County1     276  739.76     1200
# 2  County2     648  435.93     1056
# 3 County75    1104  277.41      720

数据

df <- read.table(text="Region County1 County2 County75 Multiplier
County1  0.23    0.56   0.75   1200
County2  0.54    0.33   0.66   1321 
County75 0.92    0.21   0.45   1600",strin=F,h=T)

答案 1 :(得分:2)

这将跨*的元素和df[, 6]的列映射函数df[, -c(1, 6)],即将第一“ County”列乘以第六列的第一个值,第二个“ County”乘以”,再按第六列的第二个值,依此类推。

df[, -c(1, 6)] <- Map(`*`, df[, -c(1, 6)], df[, 6])

地图输入数据:

df <- data.table::fread("
Region County1 County2 County  County75 Multiplier
County1  0.23    0.56   0.54     0.75     1200
County2  0.54    0.33   0.66     0.66     1321 
County2  0.44    0.26   0.46     0.85     1472 
County75 0.92    0.21   0.12     0.45     1600
", data.table = F)

地图输出数据

#     Region County1 County2 County County75 Multiplier
# 1  County1     276  739.76 794.88     1200       1200
# 2  County2     648  435.93 971.52     1056       1321
# 3  County2     528  343.46 677.12     1360       1472
# 4 County75    1104  277.41 176.64      720       1600