将长数据除以R中另一个数据集中的值

将长数据除以R中另一个数据集中的值,r,data-wrangling,R,Data Wrangling,我有一个长数据格式的数据集: Date Region X Y Z T D E F 01-01-2020 RegionA 2 4 2 3 2 3 4 01-01-2020 RegionB 1 3 2 2 3 3 3 01-01-2020 RegionC 1 4 4 2 3 4 2 01-01-2020 RegionD 2 4 2 3

我有一个长数据格式的数据集:

Date        Region     X   Y   Z   T    D  E   F 
01-01-2020  RegionA    2   4   2   3   2   3   4
01-01-2020  RegionB    1   3   2   2   3   3   3
01-01-2020  RegionC    1   4   4   2   3   4   2
01-01-2020  RegionD    2   4   2   3   2   4   4
01-01-2020  RegionE    1   3   2   2   2   2   2
02-01-2020  RegionA    2   4   7   3   2   3   4
02-01-2020  RegionB    1   3   2   2   2   3   3
02-01-2020  RegionC    1   4   4   8   3   4   2
02-01-2020  RegionD    2   3   2   3   2   4   4
02-01-2020  RegionE    1   3   2   2   2   2   2
日期还有很多,但这会让你对格式有一个概念

然后我有第二个数据集,其中包含关于这些地区人口的更多信息:

Region     Pop
RegionA    2000
RegionB    4039
RegionC    24728  
RegionD    3738  
RegionE    2936
我要做的是将第一个数据集中的一列除以所有日期中每个区域的人口值。例如,如果“x”是
GDP
,我想将
GDP
除以每个不同时间点的总体值。对于
RegionA
而言,对于每个
01-01-2020
02-01-2020
,这将是
2/2000
2/2000

我对R很陌生,任何帮助我开始解决这个问题的方法都会很好

这里有一个可复制的例子

date<-as.Date(c("2020-02-24T18:00:00", "2020-02-24T18:00:00", "2020-02- 
                 24T18:00:00", "2020-05-02T17:00:00", "2020-05-02T17:00:00", 
                 "2020-05-02T17:00:00"))
regions<-c("RegionA", "RegionB", "RegionC","RegionA", "RegionB", "RegionC")
total<-c(1394, 1143, 18373, 168479, 65370, 26990)
df<-data.frame(date, regions, total)
这显然是错误的


谢谢。

您可以使用
左键联接和
变异:

library(dplyr)

new_df <- left_join(df1, df2, by = "Region")

new_df %>%
   mutate_at(vars(X:F), ~ . / Pop)

一个基本R选项是使用
match

df1[-c(1:2)] <- df1[-(1:2)]/df2$Pop[match(df1$Region,df2$Region)]
数据

> dput(df1)
structure(list(Date = c("01-01-2020", "01-01-2020", "01-01-2020",
"01-01-2020", "01-01-2020", "02-01-2020", "02-01-2020", "02-01-2020", 
"02-01-2020", "02-01-2020"), Region = c("RegionA", "RegionB",
"RegionC", "RegionD", "RegionE", "RegionA", "RegionB", "RegionC",
"RegionD", "RegionE"), X = c(2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 
2L, 1L), Y = c(4L, 3L, 4L, 4L, 3L, 4L, 3L, 4L, 3L, 3L), Z = c(2L,
2L, 4L, 2L, 2L, 7L, 2L, 4L, 2L, 2L), T = c(3L, 2L, 2L, 3L, 2L, 
3L, 2L, 8L, 3L, 2L), D = c(2L, 3L, 3L, 2L, 2L, 2L, 2L, 3L, 2L,
2L), E = c(3L, 3L, 4L, 4L, 2L, 3L, 3L, 4L, 4L, 2L), F = c(4L,
3L, 2L, 4L, 2L, 4L, 3L, 2L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-10L))

> dput(df2)
structure(list(Region = c("RegionA", "RegionB", "RegionC", "RegionD",
"RegionE"), Pop = c(2000L, 4039L, 24728L, 3738L, 2936L)), class = "data.frame", row.names = c(NA, 
-5L))

欢迎来到Stackoverflow!请你提供一个最小的可重复的例子好吗?我是说,一个样本数据集,到目前为止你做了什么?。数据集的形式可以是数据集谢谢;我将尝试添加一些可复制的数据,尽管当我说我是R新手时,我是认真的!非常感谢您的回答和对其背后逻辑的解释。这是非常有用的。没问题,很高兴你发现它有用。非常感谢你的回答。我正在尝试学习dyplr,但知道如何在基本的R中执行此操作也很棒。
# A tibble: 10 x 10
   Date       Region          X        Y        Z         T        D        E         F   Pop
   <chr>      <chr>       <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>     <dbl> <dbl>
 1 01-01-2020 RegionA 0.001     0.002    0.001    0.0015    0.001    0.0015   0.002      2000
 2 01-01-2020 RegionB 0.000248  0.000743 0.000495 0.000495  0.000743 0.000743 0.000743   4039
 3 01-01-2020 RegionC 0.0000404 0.000162 0.000162 0.0000809 0.000121 0.000162 0.0000809 24728
 4 01-01-2020 RegionD 0.000535  0.00107  0.000535 0.000803  0.000535 0.00107  0.00107    3738
 5 01-01-2020 RegionE 0.000341  0.00102  0.000681 0.000681  0.000681 0.000681 0.000681   2936
 6 02-01-2020 RegionA 0.001     0.002    0.0035   0.0015    0.001    0.0015   0.002      2000
 7 02-01-2020 RegionB 0.000248  0.000743 0.000495 0.000495  0.000495 0.000743 0.000743   4039
 8 02-01-2020 RegionC 0.0000404 0.000162 0.000162 0.000324  0.000121 0.000162 0.0000809 24728
 9 02-01-2020 RegionD 0.000535  0.000803 0.000535 0.000803  0.000535 0.00107  0.00107    3738
10 02-01-2020 RegionE 0.000341  0.00102  0.000681 0.000681  0.000681 0.000681 0.000681   2936
df1[-c(1:2)] <- df1[-(1:2)]/df2$Pop[match(df1$Region,df2$Region)]
> df1
         Date  Region            X            Y            Z            T
1  01-01-2020 RegionA 1.000000e-03 0.0020000000 0.0010000000 1.500000e-03
2  01-01-2020 RegionB 2.475860e-04 0.0007427581 0.0004951721 4.951721e-04
3  01-01-2020 RegionC 4.043999e-05 0.0001617599 0.0001617599 8.087997e-05
4  01-01-2020 RegionD 5.350455e-04 0.0010700910 0.0005350455 8.025682e-04
5  01-01-2020 RegionE 3.405995e-04 0.0010217984 0.0006811989 6.811989e-04
6  02-01-2020 RegionA 1.000000e-03 0.0020000000 0.0035000000 1.500000e-03
7  02-01-2020 RegionB 2.475860e-04 0.0007427581 0.0004951721 4.951721e-04
8  02-01-2020 RegionC 4.043999e-05 0.0001617599 0.0001617599 3.235199e-04
9  02-01-2020 RegionD 5.350455e-04 0.0008025682 0.0005350455 8.025682e-04
10 02-01-2020 RegionE 3.405995e-04 0.0010217984 0.0006811989 6.811989e-04
              D            E            F
1  0.0010000000 0.0015000000 2.000000e-03
2  0.0007427581 0.0007427581 7.427581e-04
3  0.0001213200 0.0001617599 8.087997e-05
4  0.0005350455 0.0010700910 1.070091e-03
5  0.0006811989 0.0006811989 6.811989e-04
6  0.0010000000 0.0015000000 2.000000e-03
7  0.0004951721 0.0007427581 7.427581e-04
8  0.0001213200 0.0001617599 8.087997e-05
9  0.0005350455 0.0010700910 1.070091e-03
10 0.0006811989 0.0006811989 6.811989e-04
> dput(df1)
structure(list(Date = c("01-01-2020", "01-01-2020", "01-01-2020",
"01-01-2020", "01-01-2020", "02-01-2020", "02-01-2020", "02-01-2020", 
"02-01-2020", "02-01-2020"), Region = c("RegionA", "RegionB",
"RegionC", "RegionD", "RegionE", "RegionA", "RegionB", "RegionC",
"RegionD", "RegionE"), X = c(2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 
2L, 1L), Y = c(4L, 3L, 4L, 4L, 3L, 4L, 3L, 4L, 3L, 3L), Z = c(2L,
2L, 4L, 2L, 2L, 7L, 2L, 4L, 2L, 2L), T = c(3L, 2L, 2L, 3L, 2L, 
3L, 2L, 8L, 3L, 2L), D = c(2L, 3L, 3L, 2L, 2L, 2L, 2L, 3L, 2L,
2L), E = c(3L, 3L, 4L, 4L, 2L, 3L, 3L, 4L, 4L, 2L), F = c(4L,
3L, 2L, 4L, 2L, 4L, 3L, 2L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-10L))

> dput(df2)
structure(list(Region = c("RegionA", "RegionB", "RegionC", "RegionD",
"RegionE"), Pop = c(2000L, 4039L, 24728L, 3738L, 2936L)), class = "data.frame", row.names = c(NA, 
-5L))