将长数据除以 R 中另一个数据集中的值
Divide long data by values in another dataset in R
我有一个长数据格式的数据集:
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
这将是 2/2000
和 2/2000
每个 01-01-2020
和 02-01-2020
.
我是 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)
对于另一个数据框:
regions<-c("RegionA", "RegionB", "RegionC")
pop<-c(1305283, 559084, 1935414)
mydf_pop<-data.frame(regions, pop)
现在:我尝试了
的各种组合
df >%>
left_join(mydf_pop)>%>
group_by(date, regions)>%>
mutate(total/pop)
这显然是错误的。
谢谢。
您可以使用 left_join
和 mutate
:
library(dplyr)
new_df <- left_join(df1, df2, by = "Region")
new_df %>%
mutate_at(vars(X:F), ~ . / Pop)
我们通过公共列 Region
将两个数据集连接在一起,然后使用 mutate_at
重新计算变量 X
到 F
。 ~
创建一个公式对象,点 .
引用被引用的列。
这给了我们:
# 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
一个基本的 R 选项是使用 match
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))
我有一个长数据格式的数据集:
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
这将是 2/2000
和 2/2000
每个 01-01-2020
和 02-01-2020
.
我是 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)
对于另一个数据框:
regions<-c("RegionA", "RegionB", "RegionC")
pop<-c(1305283, 559084, 1935414)
mydf_pop<-data.frame(regions, pop)
现在:我尝试了
的各种组合df >%>
left_join(mydf_pop)>%>
group_by(date, regions)>%>
mutate(total/pop)
这显然是错误的。
谢谢。
您可以使用 left_join
和 mutate
:
library(dplyr)
new_df <- left_join(df1, df2, by = "Region")
new_df %>%
mutate_at(vars(X:F), ~ . / Pop)
我们通过公共列 Region
将两个数据集连接在一起,然后使用 mutate_at
重新计算变量 X
到 F
。 ~
创建一个公式对象,点 .
引用被引用的列。
这给了我们:
# 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
一个基本的 R 选项是使用 match
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))