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
from
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初始数据和预期输出背后的逻辑是什么?我不清楚这里发生了什么。@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我假设你的评论是基于其他数据集的。这是真的吗(+)没关系!我是根据别人的评论来判断的。谢谢你的帮助。正是我想要的!我只是删除了,因为我之前已经设置了。宽格式评论也非常有用。我的因变量超出了我上传的数据框,所以保持行号和顺序很重要。现在我将把它连接到一个更大的数据集。非常感谢你!正是我要找的!我只是删除了,因为我之前已经设置了。宽格式评论也非常有用。我的因变量超出了我上传的数据框,所以保持行号和顺序很重要。现在我将把它连接到一个更大的数据集。非常感谢你!