如何解决基于前导角色的条件重塑
我有两列数据框x
:
case_num <- c("ABC-01","111 XX","ABC-02","Y32 XX","113 XX","ABC-03","112 XX","Z90 XX")
transac_num <- c("DEF-01",NA,"DEF-02","DEF-03",NA)
x <- data.frame(case_num,transac_num)
case_num transac_num
ABC-01 DEF-01
111 XX
ABC-02 DEF-02
111 XX
Y32 XX
113 XX
ABC-03 DEF-03
112 XX
Z90 XX
我想重整数据集的格式,以便所有不以“ ABC”开头的行都与位于其上方的case_num
放在同一行的单独列中,以“ ABC”开头的行将保留在原处。所需的输出是:
case_num transac_num charge1 charge2 charge3
ABC-01 DEF-01 111 XX
ABC-02 DEF-02 111 XX Y32 XX 113 XX
ABC-03 DEF-03 112 XX Z90 XX
我尝试通过首先使用case_number
字段创建一个新列来指定transac_num
是案件还是指控来完成此任务:
x$type <- ifelse(is.na(x$transac_num),"charge","case")
结果
case_num transac_num type
ABC-01 DEF-01 case
111 XX charge
ABC-02 DEF-02 case
111 XX charge
Y32 XX charge
113 XX charge
ABC-03 DEF-03 case
112 XX charge
Z90 XX charge
但是,仅在条件pivot_wider
下,我无法让tidyr的case_num
从x$type == "charge"
创建新列。想法?
解决方法
我们可以使用fill
用先前的非NA值填充NA元素,slice
在第一行之外,按'transac_num'分组后,根据序列创建一个列名列从“ transac_num”开始,并使用pivot_wider
将“ long”格式重塑为“ wide”格式
library(dplyr)
library(tidyr)
library(stringr)
library(data.table)
x %>%
fill(transac_num) %>%
group_by(transac_num) %>%
slice(-1) %>%
mutate(new_col = str_c('charge',rowid(transac_num))) %>%
pivot_wider(names_from =new_col,values_from = case_num)
# A tibble: 3 x 4
# Groups: transac_num [3]
# transac_num charge1 charge2 charge3
# <chr> <chr> <chr> <chr>
#1 ABC-01 111 XX <NA> <NA>
#2 ABC-02 111 XX Y32 XX 113 XX
#3 ABC-03 112 XX Z90 XX <NA>
如果要保留另一列,请在分组依据之后创建新列
x %>%
fill(transac_num) %>%
group_by(transac_num) %>%
mutate(case_num_orig = first(case_num)) %>%
slice(-1) %>%
ungroup %>%
select(case_num_new = case_num,case_num = case_num_orig,transac_num) %>%
mutate(new_col = str_c('charge',rowid(transac_num))) %>%
pivot_wider(names_from = new_col,values_from = case_num_new)
# A tibble: 3 x 5
# case_num transac_num charge1 charge2 charge3
# <chr> <chr> <chr> <chr> <chr>
#1 ABC-01 DEF-01 111 XX <NA> <NA>
#2 ABC-02 DEF-02 111 XX Y32 XX 113 XX
#3 ABC-03 DEF-03 112 XX Z90 XX <NA>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。