R 值为文本的dcast
我希望传播或dcast一个data.frame,其中的值是文本字符串R 值为文本的dcast,r,tidyr,R,Tidyr,我希望传播或dcast一个data.frame,其中的值是文本字符串 df = data.frame(employeeid = c(1,1,2,2), question=c('do you like milk?', 'do you like apples?', 'do you like milk?', 'do you like apples?'), Answer=c('Yes','No','No','No')) 我希望将其转换为广
df = data.frame(employeeid = c(1,1,2,2),
question=c('do you like milk?', 'do you like apples?', 'do you like milk?', 'do you like apples?'),
Answer=c('Yes','No','No','No'))
我希望将其转换为广泛的格式,其中列标题是员工id和问题。我试过
df=spread(df,问题,答案)
,但似乎不行因为你的标题中有dcast
,我假设数据。表
:
data.table::dcast(问题~employeeid,数据=df,value.var=“答案”)
#问题1 2
#你喜欢苹果吗?不不
#你喜欢牛奶吗?是不是
但另一种选择是:
tidyr::spread(df,employeeid,Answer)
#问题1 2
#你喜欢苹果吗?不不
#你喜欢牛奶吗?是不是
编辑:由于数据中似乎存在重复项,您可以使用以下选项找到“最常见”的答案:
大多数情况下,我使用了dcast函数,但我收到一条消息,说聚合函数缺失,它默认为长度,这是不正确的。我不知道该说什么。。。你的数据和这个函数对我有用。这是用数据演示的。表1.12.0
和tidyr-0.8.2
在R-3.5.3上。好的,这很可能是因为您有重复的id/问题对。当这种情况发生时,即使您声明value.var=“Answer”
,它也会给出数据透视组的长度。如果这是一个已知条件,请定义一个函数,该函数始终返回第一个或最频繁的元素,但要意识到您将“丢失数据”。另一个选项是先消除重复数据:df[!duplicated(cbind(df$employeeid,df$question)),]
。啊,这很有意义。我添加了aggregate.fun=min,这样就行了。似乎不行,怎么办?您希望列名同时为ID和question吗?还是缺少一个词?@camille,在我的回答的评论中说:有重复,所以dcast
使用警告没有明确的fun\u聚合
,并使用长度
,结果是数字输出,而不是所需的字符串。(我同意这个问题应该包括这个花边。)