pivot_longer 按其他列中的匹配项
pivot_longer by match in other column
我有一个类似于以下的数据集,我使用 tidyverse 从两个不同的数据集中争论:
我想要的是 pivot_longer resident_census_total 和 visitor_census_total 到一个名为 'census_totals' 的新列中。但是,我还需要它们匹配适当的状态,例如当状态 == 'Resident' 时,我需要 'census_totals' 列具有来自 resident_census_total 的值,反之亦然。这就是我 运行 遇到麻烦的地方,因为只是使用
pivot_longer(
cols = c("resident_census_total, "visitor_census_total"),
names_to = "census_totals"
)
导致两列中的数据简单交替,而不是适当匹配。
下面的虚拟数据框:
dummy <- data.frame(
location = rep(c("j210", "s34", "q3"), 6),
day = rep(c("Day 1", "Day 2", "Day 3"), each = 3),
period = rep(c("2019_fire", "2020_YOY", "2021_YOY"), 6),
total_agents = c(3585, 1234, 0, 456, 124, 688, 24, 1235, 77, 4578, 357, 124,
2345, 14, 1223, 345, 123, 22),
Status = rep(c("Resident", "Visitor"), 9),
resident_census_total = rep(c(127, 345, 1123), 6),
visitor_census_total = rep(c(0, 266, 456), 6)
)
)
如果你能提供一个你想要的输出的例子,我们的答案会更准确,那就太好了。
根据你的问题,我猜你想要一列 consensus_totals
来替换 resident_census_total
和 visitor_census_total
。在这种情况下你真的不需要使用 pivot_longer
,只需使用 case_when()
来匹配你的 Status
并输出适当的列。
这是一个 tidyverse
方法:
如果您确定只有两个 Status
。
,您可以使用 ifelse(Status == "Resident", resident_census_total, visitor_census_total)
替换 case_when()
library(tidyverse)
dummy %>% mutate(census_totals = case_when(Status == "Resident" ~ resident_census_total,
Status == "Visitor" ~ visitor_census_total)) %>%
select(-resident_census_total, -visitor_census_total)
输出
location day period total_agents Status census_totals
1 j210 Day 1 2019_fire 3585 Resident 127
2 s34 Day 1 2020_YOY 1234 Visitor 266
3 q3 Day 1 2021_YOY 0 Resident 1123
4 j210 Day 2 2019_fire 456 Visitor 0
5 s34 Day 2 2020_YOY 124 Resident 345
6 q3 Day 2 2021_YOY 688 Visitor 456
7 j210 Day 3 2019_fire 24 Resident 127
8 s34 Day 3 2020_YOY 1235 Visitor 266
9 q3 Day 3 2021_YOY 77 Resident 1123
10 j210 Day 1 2019_fire 4578 Visitor 0
11 s34 Day 1 2020_YOY 357 Resident 345
12 q3 Day 1 2021_YOY 124 Visitor 456
13 j210 Day 2 2019_fire 2345 Resident 127
14 s34 Day 2 2020_YOY 14 Visitor 266
15 q3 Day 2 2021_YOY 1223 Resident 1123
16 j210 Day 3 2019_fire 345 Visitor 0
17 s34 Day 3 2020_YOY 123 Resident 345
18 q3 Day 3 2021_YOY 22 Visitor 456
您的数据集供参考
location day period total_agents Status resident_census_total visitor_census_total
1 j210 Day 1 2019_fire 3585 Resident 127 0
2 s34 Day 1 2020_YOY 1234 Visitor 345 266
3 q3 Day 1 2021_YOY 0 Resident 1123 456
4 j210 Day 2 2019_fire 456 Visitor 127 0
5 s34 Day 2 2020_YOY 124 Resident 345 266
6 q3 Day 2 2021_YOY 688 Visitor 1123 456
7 j210 Day 3 2019_fire 24 Resident 127 0
8 s34 Day 3 2020_YOY 1235 Visitor 345 266
9 q3 Day 3 2021_YOY 77 Resident 1123 456
10 j210 Day 1 2019_fire 4578 Visitor 127 0
11 s34 Day 1 2020_YOY 357 Resident 345 266
12 q3 Day 1 2021_YOY 124 Visitor 1123 456
13 j210 Day 2 2019_fire 2345 Resident 127 0
14 s34 Day 2 2020_YOY 14 Visitor 345 266
15 q3 Day 2 2021_YOY 1223 Resident 1123 456
16 j210 Day 3 2019_fire 345 Visitor 127 0
17 s34 Day 3 2020_YOY 123 Resident 345 266
18 q3 Day 3 2021_YOY 22 Visitor 1123 456
我有一个类似于以下的数据集,我使用 tidyverse 从两个不同的数据集中争论:
我想要的是 pivot_longer resident_census_total 和 visitor_census_total 到一个名为 'census_totals' 的新列中。但是,我还需要它们匹配适当的状态,例如当状态 == 'Resident' 时,我需要 'census_totals' 列具有来自 resident_census_total 的值,反之亦然。这就是我 运行 遇到麻烦的地方,因为只是使用
pivot_longer(
cols = c("resident_census_total, "visitor_census_total"),
names_to = "census_totals"
)
导致两列中的数据简单交替,而不是适当匹配。
下面的虚拟数据框:
dummy <- data.frame(
location = rep(c("j210", "s34", "q3"), 6),
day = rep(c("Day 1", "Day 2", "Day 3"), each = 3),
period = rep(c("2019_fire", "2020_YOY", "2021_YOY"), 6),
total_agents = c(3585, 1234, 0, 456, 124, 688, 24, 1235, 77, 4578, 357, 124,
2345, 14, 1223, 345, 123, 22),
Status = rep(c("Resident", "Visitor"), 9),
resident_census_total = rep(c(127, 345, 1123), 6),
visitor_census_total = rep(c(0, 266, 456), 6)
)
)
如果你能提供一个你想要的输出的例子,我们的答案会更准确,那就太好了。
根据你的问题,我猜你想要一列 consensus_totals
来替换 resident_census_total
和 visitor_census_total
。在这种情况下你真的不需要使用 pivot_longer
,只需使用 case_when()
来匹配你的 Status
并输出适当的列。
这是一个 tidyverse
方法:
如果您确定只有两个 Status
。
ifelse(Status == "Resident", resident_census_total, visitor_census_total)
替换 case_when()
library(tidyverse)
dummy %>% mutate(census_totals = case_when(Status == "Resident" ~ resident_census_total,
Status == "Visitor" ~ visitor_census_total)) %>%
select(-resident_census_total, -visitor_census_total)
输出
location day period total_agents Status census_totals
1 j210 Day 1 2019_fire 3585 Resident 127
2 s34 Day 1 2020_YOY 1234 Visitor 266
3 q3 Day 1 2021_YOY 0 Resident 1123
4 j210 Day 2 2019_fire 456 Visitor 0
5 s34 Day 2 2020_YOY 124 Resident 345
6 q3 Day 2 2021_YOY 688 Visitor 456
7 j210 Day 3 2019_fire 24 Resident 127
8 s34 Day 3 2020_YOY 1235 Visitor 266
9 q3 Day 3 2021_YOY 77 Resident 1123
10 j210 Day 1 2019_fire 4578 Visitor 0
11 s34 Day 1 2020_YOY 357 Resident 345
12 q3 Day 1 2021_YOY 124 Visitor 456
13 j210 Day 2 2019_fire 2345 Resident 127
14 s34 Day 2 2020_YOY 14 Visitor 266
15 q3 Day 2 2021_YOY 1223 Resident 1123
16 j210 Day 3 2019_fire 345 Visitor 0
17 s34 Day 3 2020_YOY 123 Resident 345
18 q3 Day 3 2021_YOY 22 Visitor 456
您的数据集供参考
location day period total_agents Status resident_census_total visitor_census_total
1 j210 Day 1 2019_fire 3585 Resident 127 0
2 s34 Day 1 2020_YOY 1234 Visitor 345 266
3 q3 Day 1 2021_YOY 0 Resident 1123 456
4 j210 Day 2 2019_fire 456 Visitor 127 0
5 s34 Day 2 2020_YOY 124 Resident 345 266
6 q3 Day 2 2021_YOY 688 Visitor 1123 456
7 j210 Day 3 2019_fire 24 Resident 127 0
8 s34 Day 3 2020_YOY 1235 Visitor 345 266
9 q3 Day 3 2021_YOY 77 Resident 1123 456
10 j210 Day 1 2019_fire 4578 Visitor 127 0
11 s34 Day 1 2020_YOY 357 Resident 345 266
12 q3 Day 1 2021_YOY 124 Visitor 1123 456
13 j210 Day 2 2019_fire 2345 Resident 127 0
14 s34 Day 2 2020_YOY 14 Visitor 345 266
15 q3 Day 2 2021_YOY 1223 Resident 1123 456
16 j210 Day 3 2019_fire 345 Visitor 127 0
17 s34 Day 3 2020_YOY 123 Resident 345 266
18 q3 Day 3 2021_YOY 22 Visitor 1123 456