r语言 - collect()有两个键列



我有一个数据集,有两行数据,并希望使用类似gather()的东西来整理它们,但不知道如何将两者标记为键列。

数据如下:

Country  US   Canada  US 
org_id   332  778     920
02-15-20 25   35      54
03-15-20 30   10      60

我想让它看起来像

country  org_id  date      purchase_price 
US       332      02-15-20 25
Canada   778      02-15-20 35
US       920      02-15-20 54
US       332      03-15-20 30
Canada   778      03-15-20 10
US       920      03-15-20 60

我知道gather()可以移动国家行到列,例如,但是有一种方法来移动国家和org_id行到列吗?

在数据中有重复的列名不是一个好主意,所以我将重命名其中一个。

names(df)[4] <- 'US_1'
  • gather已被pivot_longer取代。

  • 这不是一个传统的重塑,因为第一行中的数据需要与其他行不同的处理,所以我们可以单独执行重塑,并将结果组合起来得到一个最终的数据帧。

library(dplyr)
library(tidyr)
df1 <- df %>% slice(-1L) %>% pivot_longer(cols = -Country)
df %>% 
slice(1L) %>%
pivot_longer(-Country, values_to = 'org_id') %>%
select(-Country) %>%
inner_join(df1, by = 'name') %>%
rename(Country = name, date = Country) -> result
result
#  Country org_id date     value
#  <chr>    <int> <chr>    <int>
#1 US         332 02-15-20    25
#2 US         332 03-15-20    30
#3 Canada     778 02-15-20    35
#4 Canada     778 03-15-20    10
#5 US_1       920 02-15-20    54
#6 US_1       920 03-15-20    60

df <- structure(list(Country = c("org_id", "02-15-20", "03-15-20"), 
US = c(332L, 25L, 30L), Canada = c(778L, 35L, 10L), US = c(920L, 
54L, 60L)), class = "data.frame", row.names = c(NA, -3L))

首先将Countryorg_id粘贴在一起

library(tidyverse)
data <- set_names(data, paste(names(data), data[1,], sep = "-")) 
data
Country-org_id US-332 Canada-778 US-920
1         org_id    332        778    920
2       02-15-20     25         35     54
3       03-15-20     30         10     60

然后,我们删除第一行,透视表并分离列名。

df <-  data %>% 
slice(2:n()) %>% 
rename(date = `Country-org_id`) %>% 
pivot_longer(cols = -date, values_to = "price") %>% 
separate(col = name, into = c("country", "org_id"), sep = "-")
df
# A tibble: 6 x 4
date     country org_id price
<chr>    <chr>   <chr>  <int>
1 02-15-20 US      332       25
2 02-15-20 Canada  778       35
3 02-15-20 US      920       54
4 03-15-20 US      332       30
5 03-15-20 Canada  778       10
6 03-15-20 US      920       60

最新更新