【问题标题】:Multiply specific row element of a column to a each column in a set of columns within the same dataframe将列的特定行元素乘以同一数据框中的一组列中的每一列
【发布时间】:2018-07-16 12:28:30
【问题描述】:

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

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

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

我想将 Multiplier 的第一个行元素乘以第一个 County 列(例如: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

谢谢!

【问题讨论】:

  • Table1$County1 &lt;- Table1$Multiplier[1] * Table1$County1 ?不清楚你期望什么输出,你能在你的问题中列出吗?
  • 是的,这就是我想要的。乘数是每个县的人口未来预测。所以乘数的第一行(即 1200 将乘以整个 County1 列,1321 将乘以整个 County2 列...1600 将乘以 County75 列)。 County1 - County75 中的每个值都是某个时间点(过去某处)某个人口与人口的比率。我希望这有助于解释一点,这是团队负责人的要求:(。我知道那个逻辑有点不稳定
  • @Moody_Mudskipper 我已根据您的评论更新了我的问题。很抱歉造成混乱
  • 一切都好,告诉我我的答案是否如你所愿
  • 不幸的是,dplyr 代码不能满足我的需要。让我看看我是否可以更好地解释这个问题,因为逻辑非常不稳定。所以列(county1,county2,..county75)需要分别乘以相应的行(乘数行的第一个元素,乘数行的第二个元素,...75th)。不幸的是,它不是一个直接的聚集、乘法和传播类型的应用程序,也不是那么简单的 mutate :(。这就是为什么我使用 [1] 表示法来表明只有第一个元素乘以整个 County1 列

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


【解决方案1】:

这是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)

【讨论】:

  • 很抱歉之前的评论,我再次检查了它。这实际上有一个小问题,当它将列聚集在一起时,上面的操作仍然没有给我想要的结果。我也试过这个:我将乘数列转换为一行并尝试将其添加到每个县的底部(使用 rbind),但我不知道如何将最后一行的值乘以它上面的所有行。我能解释我到底想要什么吗?这不是很容易解释:(
  • 正如我在问题的 cmets 中所问的那样,您应该在问题中列出您的精确预期输出。这比冗长的解释要快得多。这个问题可能有用:stackoverflow.com/questions/5963269/…
  • 哦,好吧!我会尽量把输出!由于数据是秘密的,我不得不在那里输入假数字。让我编辑我的问题...对不起
  • 我现在用输出更新了我的问题。抱歉,我是新来的,所以我仍在努力了解规范:) 感谢上面的链接
  • 好的,我试试看!谢谢,我更喜欢 dplyr,因为我必须将它放在地图的较大部分(purrr)或所有不同状态的循环中!
【解决方案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

【讨论】:

  • 很好,这会比我的快,但你必须确保你没有丢失行/列并且行已排序,因为你不使用 Region 列全部。
  • @Ryan 哦,好的,谢谢!我想我会坚持使用基于 R 的 dplyr 方法,因为我必须为一堆状态执行此操作,并且它们最终可能会出现一些缺失值。我在 data.table 上苦苦挣扎,所以一旦我开始学习如何很好地使用它,我就会回到这个问题上 :)
  • 不幸的是,上面的 dplyr 代码不能满足我的需要。让我看看我是否可以更好地解释这个问题,因为逻辑非常不稳定。所以列(county1,county2,..county75)需要分别乘以相应的行(乘数行的第一个元素,乘数行的第二个元素,...75th)。不幸的是,它不是一个直接的收集、乘法和传播类型的应用程序,也不是那么简单的 mutate :(
  • 我明白了。我认为Map 应该在这种情况下工作。看我的编辑。 @AnuragKaushik
  • @Ryan 好的,谢谢,我会尽快尝试并在这里发布!
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多