我正在尝试从宽格式到长格式收集不整洁的数据。 我有748个变量,需要将其压缩为大约30。
在this post中,我问:如何整理我的大量数据?答案:使用collect()。
但是,我仍在努力收集多个专栏,希望您能指出我要去哪里。
可复制的示例:
tb1 <- tribble(~x1,~x2,~x3,~y1,~y2,~y3,
1,NA,NA,NA,1,NA,
NA,1,NA,NA,NA,1,
NA,NA,1,NA,NA,1)
# A tibble: 3 x 6
# x1 x2 x3 y1 y2 y3
# <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
#1 1 NA NA NA 1 NA
#2 NA 1 NA NA NA 1
#3 NA NA 1 NA NA 1
x1-y3具有以下特征:
1 x1 Green
2 x2 Yellow
3 x3 Orange
4 y1 Yes
5 y2 No
6 y3 Maybe
我尝试过:
tb1 %>%
rename("Green" =x1,
"Yellow"=x2,
"Orange"=x3,
"Yes"=y1,
"No"=y2,
"Maybe"=y3) %>%
gather(X,val,-Green,-Yellow,-Orange) %>%
gather(Y,val,-X) %>%
select(-val)
我确实得到了我想要的这些变量的输出,但是我无法想象如何对700多个变量执行此操作?有没有更有效的方法?
tb1 %>%
rename("Green" =x1,
"Yellow"=x2,
"Orange"=x3,
"Yes"=y1,
"No"=y2,
"Maybe"=y3) %>%
gather(X,val,-Green,-Yellow,-Orange) %>%
filter(!is.na(val)) %>%
select(-val) %>%
gather(Y,val,-X) %>%
filter(!is.na(val)) %>%
select(-val)
# A tibble: 3 x 2
X Y
<chr> <chr>
1 No Green
2 Maybe Yellow
3 Maybe Orange
我想我可能对gather()不够熟,所以这可能是一个愚蠢的问题-感谢您的帮助。谢谢!
答案 0 :(得分:1)
我假设这里的问题是手动指定所有不同的变量名称。幸运的是,tidyverse
具有?select_helpers
,可以更轻松地根据不同的规则选择列。
我们可以在变量的末尾重命名,而不必在变量开头重新命名。这样一来,我们就可以使用starts_with
获取以x
或y
开头的所有列,并将它们汇总在一起。然后,我们可以使用ends_with
从这些收集步骤中选择值列并进行过滤和删除。
最后,我们使用x1
和查找表一步一步将y1
,mutate_all
等的所有值替换为其真实值
# Make lookup table to match X and Y variables with Values
# the initial values should be the `names` (first) and the values to change them to
# should be the `values` (after the =)
lookup <- c('x1' = 'Green',
'x2' = 'Yellow',
'x3' = 'Orange',
'y1' = 'Yes',
'y2' = 'No',
'y3' = 'Maybe')
tb1 %>%
gather(X, Xval, starts_with('x')) %>% # Gather all variables that start with ‘x'
gather(Y, Yval, starts_with('y')) %>% # Gather all variables that start with ‘y'
filter_at(vars(ends_with('val')), # Looking in columns ending with ‘val'
all_vars(!is.na(.))) %>% %>% # Drop rows if ANY of these cols are NA
select(-ends_with('val')) %>% # Drop columns ending in ‘val'
mutate_all(~lookup[.]) # Replace value from lookup table in all cols
# A tibble: 3 x 2
X Y
<chr> <chr>
1 Green No
2 Yellow Maybe
3 Orange Maybe
使用select_helpers时,一件棘手的事情是知道何时单独使用它们以及何时需要向vars
“注册”它们。在gather
和select
中,您可以按原样使用它们。在mutate
,filter
,summarize
等中,您需要用vars