r - 如何在 R 中拆分变量?
问题描述
我有以下数据框,其中包含单行的多个值
小标题:1,751 x 1 值
1 2 3 5
2 2 4
3 2
4 1 2 3 4
...还有 1,741 行
这种结构的原因是我有一个在线问卷,它接受同一个问题的多个答案(1,2,3,4,5,6 对应答案,每行是一个受访者),但数据的存储方式是一个问题,因为如果不事先操作数据框,就无法显示所有堆叠的答案。
不幸的是,我不知道如何以每行包含一个值的方式操作数据框。或者,将答案分成不同的列也很有用。任何帮助将非常感激。
解决方案
将您的 tibble 对象视为 df,
在每一行中创建一个元素向量:
newdf <- strsplit(df$x, " ")
将列表中的向量转换为数值:
newdf <- lapply(newdf, as.numeric)
查找列表中的最大值:
cl <- max(unlist(lapply(newdf, max)))
为每个响应创建一个包含列的空矩阵:
out <- matrix(nrow = nrow(df), ncol = cl)
根据响应中相应数字的出现填充响应列:
for (i in 1:length(newdf)) {
out[i,] <- 1:cl %in% newdf[[i]]
}
使用选项编号重命名列:
colnames(out) <- paste("Opt", 1:cl, sep = "_")
将矩阵转换为小标题:
out <- tibble::as.tibble(out)
最后的小标题:
out
# A tibble: 4 x 5
Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
<lgl> <lgl> <lgl> <lgl> <lgl>
1 FALSE TRUE TRUE FALSE TRUE
2 FALSE TRUE FALSE TRUE FALSE
3 FALSE TRUE FALSE FALSE FALSE
4 TRUE TRUE TRUE TRUE FALSE
编辑:
如果你确定选项的数量(这里是 6),你可以有
cl <- 6
如果您不希望有 true 或 false,您可以运行它。值 1 表示选择了相应的选项。
out <- as.data.frame(out)
for (i in colnames(out)) {
out[,i] <- as.integer(out[,i])
}
Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
1 0 1 1 0 1
2 0 1 0 1 0
3 0 1 0 0 0
4 1 1 1 1 0
如果您想使用选项编号而不是 0 和 1:
out <- as.data.frame(out)
for (i in 1:ncol(out)) {
out[,i] <- as.integer(out[,i])*i
}
Opt_1 Opt_2 Opt_3 Opt_4 Opt_5
1 0 2 3 0 5
2 0 2 0 4 0
3 0 2 0 0 0
4 1 2 3 4 0
推荐阅读
- expo - 由于解析失败,无法在 Expo Notification 中获取 expoToken:Lcom/google/firebase/iid/FirebaseInstanceId;
- rest - OData - 在同一字段上使用多个条件缩短过滤器查询
- android - 如何使用 FFmpeg 添加旋转动画以将图像覆盖在另一个带有音频文件的图像上
- flutter - 是否有 dart 函数注释使类型检查器执行类型缩小或条件断言
- scale - R中的Levelplot - 轴标签的比例
- node.js - Kubernetes/Istio - 出错时重启服务
- javascript - 是否可以在赛普拉斯的一次测试中自动化多个网址?
- mongodb - 在MongoDB中创建数据时,有一个自动生成的值,我该如何控制呢?
- c# - 使用 EWS API 将 EmailBody 保存为 PDF 文件
- fp-ts - 弃用 getFoldableComposition、option、array 等后的重构