R 从混合类别的列中为每个类别构建单独的列
我有一个包含三类评估的调查数据框架。我确实想在每一列中看到每个类别的评估,但它是这样混合的R 从混合类别的列中为每个类别构建单独的列,r,dplyr,data-cleaning,stringr,R,Dplyr,Data Cleaning,Stringr,我有一个包含三类评估的调查数据框架。我确实想在每一列中看到每个类别的评估,但它是这样混合的 ID q1 q2 q3 q4 q5 q6 1 c2 e1 c1 e1 c3 e2 2 c1 e1 c3 e2 c2 e0 3 c3 e0 c2 e2 c1 e1 我想得到的是: ID c1 c2 c3 1 e1 e1 e2 2 e1 e0 e2 3 e1 e2 e0 然而,通过stringr和dplyr尝试了几种方法,现在我被困在这里: ID a1 a2 a3
ID q1 q2 q3 q4 q5 q6
1 c2 e1 c1 e1 c3 e2
2 c1 e1 c3 e2 c2 e0
3 c3 e0 c2 e2 c1 e1
我想得到的是:
ID c1 c2 c3
1 e1 e1 e2
2 e1 e0 e2
3 e1 e2 e0
然而,通过stringr和dplyr尝试了几种方法,现在我被困在这里:
ID a1 a2 a3
1 c1-e1 c2-e1 c3-e2
2 c1-e1 c2-e0 c3-e2
3 c1-e1 c2-e2 c3-e0
有人知道如何解决这个问题吗?提前谢谢你 我们可以使用
split
根据列名分隔列中的值
如果您有有限的列,您可以手动创建列(就像我做的那样),或者根据列的结构使用paste
和seq
进行编程
cols <- c("q1", "q3", "q5")
vals <- c("q2", "q4", "q6")
do.call("cbind.data.frame", split(unlist(df[vals]), unlist(df[cols])))
# c1 c2 c3
#q22 e1 e1 e0
#q41 e1 e2 e2
#q63 e1 e0 e2
正如@Farah Nazifa所提到的,如果我们想要维护每一列的行顺序,我们可以使用
mapply
,如下所示
col_values <- unlist(df[cols])
data.frame(mapply(function(x, y) x[y],
split(unlist(df[vals]), col_values), split(row(df[vals]), col_values)))
# c1 c2 c3
#q41 e1 e1 e2
#q22 e1 e0 e2
#q63 e1 e2 e0
col\u values我们可以使用split
根据列名分离列中的值
如果您有有限的列,您可以手动创建列(就像我做的那样),或者根据列的结构使用paste
和seq
进行编程
cols <- c("q1", "q3", "q5")
vals <- c("q2", "q4", "q6")
do.call("cbind.data.frame", split(unlist(df[vals]), unlist(df[cols])))
# c1 c2 c3
#q22 e1 e1 e0
#q41 e1 e2 e2
#q63 e1 e0 e2
正如@Farah Nazifa所提到的,如果我们想要维护每一列的行顺序,我们可以使用mapply
,如下所示
col_values <- unlist(df[cols])
data.frame(mapply(function(x, y) x[y],
split(unlist(df[vals]), col_values), split(row(df[vals]), col_values)))
# c1 c2 c3
#q41 e1 e1 e2
#q22 e1 e0 e2
#q63 e1 e2 e0
col_值看起来像是一个长的堆栈,然后将其重塑为宽格式将实现这一点。这种逻辑大约有320万种变体,但这里有一种:
tmp <- reshape(dat, idvar="ID", varying=list(c(2,4,6),c(3,5,7)),
v.names=c("name","value"), direction="long", timevar=NULL)
# ID name value
#1.1 1 c2 e1
#2.1 2 c1 e1
#3.1 3 c3 e0
#1.2 1 c1 e1
#2.2 2 c3 e2
#3.2 3 c2 e2
#1.3 1 c3 e2
#2.3 2 c2 e0
#3.3 3 c1 e1
看起来像是一个长的堆栈,然后重塑为宽的格式将完成这一点。这种逻辑大约有320万种变体,但这里有一种:
tmp <- reshape(dat, idvar="ID", varying=list(c(2,4,6),c(3,5,7)),
v.names=c("name","value"), direction="long", timevar=NULL)
# ID name value
#1.1 1 c2 e1
#2.1 2 c1 e1
#3.1 3 c3 e0
#1.2 1 c1 e1
#2.2 2 c3 e2
#3.2 3 c2 e2
#1.3 1 c3 e2
#2.3 2 c2 e0
#3.3 3 c1 e1
我们可以使用data.table
library(data.table)
dcast(melt(setDT(df1), measure = patterns('^q[135]', '^q[246]')),
ID ~ value1, value.var = 'value2')
# ID c1 c2 c3
#1: 1 e1 e1 e2
#2: 2 e1 e0 e2
#3: 3 e1 e2 e0
数据
df1我们可以使用melt/dcast
fromdata.table
library(data.table)
dcast(melt(setDT(df1), measure = patterns('^q[135]', '^q[246]')),
ID ~ value1, value.var = 'value2')
# ID c1 c2 c3
#1: 1 e1 e1 e2
#2: 2 e1 e0 e2
#3: 3 e1 e2 e0
数据
df1初始数据和预期输出背后的逻辑是什么?我不清楚这里发生了什么。@Late Mail感谢您的评论,并为我的解释表示歉意!我试图为回归分析构建自变量。在这种情况下,每个类别(c1、c2、c3)的评估将是三个独立变量。“这足以给你提供背景吗?”Latmill说,所以这项调查询问了受访者对每个类别的评价。但问题的顺序是随机的。他们按照c2>c1>c3(第一个矩阵中的id 1)的顺序询问某人,然后以c1>c3>c2(id 2)的顺序询问另一个人。调查小组没有按类别排列这些数据。初始数据和您的预期输出背后的逻辑是什么?我不清楚这里发生了什么。@Late Mail感谢您的评论,并为我的解释表示歉意!我试图为回归分析构建自变量。在这种情况下,每个类别(c1、c2、c3)的评估将是三个独立变量。“这足以给你提供背景吗?”Latmill说,所以这项调查询问了受访者对每个类别的评价。但问题的顺序是随机的。他们按照c2>c1>c3(第一个矩阵中的id 1)的顺序询问某人,然后以c1>c3>c2(id 2)的顺序询问另一个人。调查小组并没有对这些数据进行分类整理。答案是相似的,但并不准确。还有什么可以做的吗?@FarahNazifa答案中缺少什么?c2和c3与预期不匹配output@FarahNazifa谢谢,也许你是对的。我也更新了那个案例的答案。不知道为什么,但“mapply”部分对我不起作用。但我可以学会如何处理这种情况。非常感谢你!答案是相似的,但并不确切。还有什么可以做的吗?@FarahNazifa答案中缺少什么?c2和c3与预期不匹配output@FarahNazifa谢谢,也许你是对的。我也更新了那个案例的答案。不知道为什么,但“mapply”部分对我不起作用。但我可以学会如何处理这种情况。非常感谢你!它显示了我想要的最接近的答案,但无法保持原始的行顺序。我能问你有什么进一步的建议吗?@Ji WonLee如果我检查一下你的预期产量,顺序是一样的。你能再多点吗specific@Ji-WonLee我假设你的评论是基于其他数据集的。这是真的吗(+)没关系!我是根据别人的评论来判断的。谢谢你的帮助。它显示了我想要的最接近的答案,但无法保持原来的行顺序。我能问你有什么进一步的建议吗?@Ji WonLee如果我检查一下你的预期产量,顺序是一样的。你能再多点吗specific@Ji-WonLee我假设你的评论是基于其他数据集的。这是真的吗(+)没关系!我是根据别人的评论来判断的。谢谢你的帮助。正是我想要的!我只是删除了,因为我之前已经设置了。宽格式评论也非常有用。我的因变量超出了我上传的数据框,所以保持行号和顺序很重要。现在我将把它连接到一个更大的数据集。非常感谢你!正是我要找的!我只是删除了,因为我之前已经设置了。宽格式评论也非常有用。我的因变量超出了我上传的数据框,所以保持行号和顺序很重要。现在我将把它连接到一个更大的数据集。非常感谢你!