请考虑以下数据框:
data_frame(
col1 = c("2017", "June", "New", 10, 30),
col2 = c("2018", "July", "Old", 20, 50),
name = c(NA, NA, NA, "dog", "cat")
)
# A tibble: 5 x 3
col1 col2 name
1 2017 2018 NA
2 June July NA
3 New Old NA
4 10 20 dog
5 30 50 cat
我想将其转换为以下输出:
## Year Month Type name Amount
## 2017 June New dog 10
## 2018 July Old dog 20
## 2017 June New cat 30
## 2018 July Old cat 50
我尝试使用数据透视表的时间更长,但是很难处理多个行以及使用NA处理死角。
答案 0 :(得分:1)
我确定了3种类型的数据,将它们粉碎成一个数据帧,然后将它们分离,从而得出了结论。就像上面的@jdobres所说,这可能不会超出此玩具示例的范围,而应该是一个开始。
据我所知,根据col1
中的正则表达式搜索,您可以提取三种类型的数据:
^20\\d{2}$
标识的年份(如果包括19xx年等,则需要进行调整col1
中的值类型或非NA
name
来标识过滤并调整形状,使它们的数据与所需输出中显示的形状匹配:
library(dplyr)
library(tidyr)
yrs_df <- df %>%
filter(grepl("^20\\d{2}$", col1)) %>%
gather(key, value = year) %>%
filter(!is.na(year))
name_df <- df %>%
filter(!is.na(name)) %>%
gather(key, value, -name)
由于您在同一列中同时拥有month
和type
,并且也希望将它们分开,因此第二次调整了月份。
month_df <- df %>%
filter(grepl("^\\D", col1)) %>%
mutate(col_type = row_number()) %>%
gather(key, value, -col_type) %>%
filter(!is.na(value)) %>%
spread(key = col_type, value, sep = "") %>%
rename(month = col_type1, type = col_type2)
yrs_df
#> # A tibble: 2 x 2
#> key year
#> <chr> <chr>
#> 1 col1 2017
#> 2 col2 2018
name_df
#> # A tibble: 4 x 3
#> name key value
#> <chr> <chr> <chr>
#> 1 dog col1 10
#> 2 cat col1 30
#> 3 dog col2 20
#> 4 cat col2 50
month_df
#> # A tibble: 2 x 3
#> key month type
#> <chr> <chr> <chr>
#> 1 col1 June New
#> 2 col2 July Old
然后按键将所有内容重新连接起来(由于所有连接都在同一列上,因此也可以使用purrr::reduce
)
yrs_df %>%
inner_join(month_df, by = "key") %>%
inner_join(name_df, by = "key")
#> # A tibble: 4 x 6
#> key year month type name value
#> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 col1 2017 June New dog 10
#> 2 col1 2017 June New cat 30
#> 3 col2 2018 July Old dog 20
#> 4 col2 2018 July Old cat 50
所有这些-这里可能存在一个更大的问题,使您的所有数据变得如此混乱,可以在上游进一步解决。