【问题标题】:Dividing multiple columns conditionally有条件地划分多列
【发布时间】:2017-07-17 06:44:17
【问题描述】:

我想将我的供应数据框除以我的人口数据框,以创建人均供应数据框。每个数据框都有一个项目列、一个国家列和多个年份列(每一年的数据列)。我需要匹配国家,然后将供应数据框中的每个条目除以人口数据框中的相应值。

有什么建议吗?我什么都想不出来。

【问题讨论】:

  • 请展示一个可重现的小示例和基于此的预期输出。尝试使用 dplyr 中的 mergeleft_join 并通过除法替换值
  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。

标签: r conditional division


【解决方案1】:

也许这可以帮助你找到正确的方向:

# sample data
population = data.frame(country = c("A","B"),population = c(100,200))
data = data.frame(country=c("A","B"), y2016 = c(1000,2000), y2017=c(2000,3000))

library(dplyr)
# join the population and the data dataframe based on the 'country' column.
data =data %>% left_join(population)

# divide all columns except the columns 'country' and 'population' by the population column.
data[, colnames(data)[!colnames(data) %in% c("country","population")]] = data[, colnames(data)[!colnames(data) %in% c("country","population")]]/data$population

输入:

> population
  country population
1       A        100
2       B        200
> data
  country y2016 y2017
1       A  1000  2000
2       B  2000  3000

输出:

  country y2016 y2017 population
1       A    10    20        100
2       B    10    15        200

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    i1 <- grep("year", names(df1))
    i2 <- paste0("i.", i1)
    setDT(df1)[df2, (i1) := Map(`/`, mget(i1), mget(i2)), on = .(country)]
    df1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2014-03-05
      • 2018-10-16
      • 2017-12-18
      • 2020-07-08
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多