提前感谢您的帮助。 我正在清理一项质量调查中的数据,其中包括一些答案选择是随机的问题(例如,您对五个电视节目进行评分,并且每个受访者的节目顺序都是随机的)。每个答案显示为单独的列:例如tv_show_1、tv_show_2,行是各个受访者的评分(优秀、好、差等),然后有一列告诉我每个调查受访者的显示顺序,电视节目使用像这样的竖线分隔|。
我从来没有处理过这样的事情,并且有点困惑。我希望得到一些帮助,了解如何编写 R 代码或可以获取显示顺序列的函数,并使用它对前五列中给出的答案进行分类(或者您能想到的任何其他比这更好的方法) )。谢谢!
我还没有尝试过任何东西!看看数据就知道了
这是数据的示例(这是为示例而制作的!):
respondents <- c("Respondent 1", "Respondent 2", "Respondent 3")
tv_show_1 <- c("excellent", "good", "bad")
tv_show_2 <- c("good", "bad", "neutral")
tv_show_3 <- c("neutral", "good", "neutral")
tv_show_DO <- c("Friends|Seinfeld|Full House", "Seinfeld|Friends|Full House", "Seinfeld|Full House|Friends")
df <- data.frame(respondents, tv_show_1, tv_show_2, tv_show_3, tv_show_DO)
print(df)
试试这个
> res <- by(df, df$respondents, \(x) {
+ shw <- el(strsplit(x$tv_show_DO, '\\|'))
+ tv <- unlist(x[grep('^tv_show_[1-3]', names(x))])[order(shw)] |>
+ setNames(sort(shw)) |> t() |> as.data.frame()
+ cbind(respondents=x[, 1], tv)
+ }) |> do.call(what='rbind')
> res
respondents Friends Full House Seinfeld
Respondent 1 Respondent 1 excellent neutral good
Respondent 2 Respondent 2 bad good good
Respondent 3 Respondent 3 neutral neutral bad
您拥有按列名称编码的数据(例如
tv_show_1
)和按位置编码的数据(例如 a|b|c
)的组合。有很多方法可以解决这个问题,但为了进一步分析,我建议将数据放入整洁的格式,其中位置编码在其自己的列中明确显示。我们可以分别对两种类型的数据进行此操作,然后将它们组合起来。
library(tidyverse)
首先,我收集评级列并将其旋转更长的时间。
df_ratings <- df |>
select(-tv_show_DO) |>
pivot_longer(-respondents)
我们可以对分隔数据做类似的事情:
df_shows <- df |>
select(respondents, tv_show_DO) |>
separate_longer_delim(tv_show_DO, delim = "|") |>
mutate(name = paste0("tv_show_", row_number()), .by = respondents)
最后结合:
df_shows |>
left_join(df_ratings)