[英]Tidying in R: how to collapse my binary columns into characters, based on vectors?
我正在整理R中的数据,并希望使用对向量项进行迭代的函数将多列变为1。 我想知道您是否可以帮助我:
我的数据基于对32个问题的调查。 每个问题都有多个答案。 每个答案都是一列,带有选项1和NA。
对于一个问题,可以按如下方式复制数据集的一部分:
XV2_1 <- c(1,NA,NA,NA)
XV2_2 <- c(NA,1,NA,NA)
XV2_3 <- c(NA,NA,NA,1)
XV2_4 <- c(NA,NA,1,NA)
id <- c(12,13,14,15)
dat <- data.frame(id,XV2_1, XV2_2, XV2_3,XV2_4)
> dat
id XV2_1 XV2_2 XV2_3 XV2_4
1 12 1 NA NA NA
2 13 NA 1 NA NA
3 14 NA NA NA 1
4 15 NA NA 1 NA
这是我想要的数据(
question_2_answers <- c("Yellow","Blue","Green","Orange") #this is a vector based on the answers of the questionnaire
collapsed <- c("Yellow","Blue","Orange","Green")
collapsed_dataframe <- data.frame(id,collapsed)
>collapsed_dataframe
id X2
1 12 Yellow
2 13 Blue
3 14 Green
4 15 Orange
到目前为止,我尝试了将“ ifelse's”与mutate结合使用的序列:
library(tidyverse)
question_2_answers <- c("Yellow","Blue","Green","Orange") #this is a vector based on the answers of the questionnaire
dat %>%
mutate(
Colour = tidy_Q2(question_2_answers,XV2_1,XV2_2,XV2_3,XV2_4)
)
tidy_Q2 <- function(a,b,c,d,e) {
ifelse(b == 1, a[1],ifelse(
c==1,a[2],ifelse(
d==1,a[3],a[4])))
}
但是,我的输出不符合预期:
id XV2_1 XV2_2 XV2_3 XV2_4 Colour
1 12 1 NA NA NA Yellow
2 13 NA 1 NA NA <NA>
3 14 NA NA NA 1 <NA>
4 15 NA NA 1 NA <NA>
我希望它如下:
id XV2_1 XV2_2 XV2_3 XV2_4 Colour
1 12 1 NA NA NA Yellow
2 13 NA 1 NA NA Blue
3 14 NA NA NA 1 Green
4 15 NA NA 1 NA Orange
有谁知道消除错误的方法吗? 我想问的另一个问题是,我的代码是否可以更高效? 此后,我存储了32个survey_questions,我想尽可能地使过程自动化。 需要注意的重要事项:
一直乐于学习,
最好,
玛丽亚
这是我们可以使用tidyr::gather
进行的tidyr::gather
到长的转换 :
首先,我们为相应行的列名称设置颜色:
# Replace column names (except for the `id` column) with color values
colnames(dat)[-1] <- c("Yellow","Blue","Orange","Green")
dat
id Yellow Blue Orange Green
1 12 1 NA NA NA
2 13 NA 1 NA NA
3 14 NA NA NA 1
4 15 NA NA 1 NA
然后,我们收集非id列并删除NA值:
library(tidyverse)
dat %>%
gather(X2, val, -id) %>% # Gather color cols from wide to long format
filter(!is.na(val)) %>% # Drop rows with NA values
select(-val) # Remove the unnecessary `val` column
id X2
1 12 Yellow
2 13 Blue
3 15 Orange
4 14 Green
这将与任意数量(你只需要指定你不想收集所有列),并保持与非行列的工作NA
值。 如果您希望其他条件排除行(例如,如果0
或'unknown'
应计为无答案,或仅将'correct'
数计为答案),则应将这些条件添加到filter
语句中。
以base R
为max.col
一个选项是max.col
是找到每行中都不是NA
的值的列索引,使用该值获取与索引相对应的列名, cbind
通过与c cbind
来创建2列data.frame。第一栏
i1 <- max.col(!is.na(dat[-1]), 'first')
cbind(dat['id'], Colour = names(dat)[-1][i1])
# id Colour
#1 12 Yellow
#2 13 Blue
#3 14 Green
#4 15 Orange
dat <- structure(list(id = c(12, 13, 14, 15), Yellow = c(1, NA, NA,
NA), Blue = c(NA, 1, NA, NA), Orange = c(NA, NA, NA, 1), Green = c(NA,
NA, 1, NA)), class = "data.frame", row.names = c(NA, -4L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.