2016-02-25 29 views
1

我是一名R新手,他正在努力解决与调查中的likert项目分析相关的一些基本问题。在数据框的多个列上折叠类似因素

具体来说,我遇到了两个问题 - 首先,我不知道如何在数据框的列之间更改相似的因子名称,其次,我正在寻找一种高效且简单的方法同时跨越数据框的多列折叠因子类别。例如,如果第1至第3列都有“非常不满意”,“中等不满意”等七个等级,直到“非常满意”,我如何将类别归为“不满意”和“满意” ,同时在所有三列?

我也希望实现这一目标,而与数据帧的工作,而不是转化为矩阵,或其他数据对象。也许我对因素的理解需要改进,但我知道因素有一个潜在的数字。我希望找到一种方法来在使用因子名称时获得结果,而不是指数字。或者我在这里错过了一些显而易见的因素?

我已经从车上包重新编码发挥各地,但我觉得有可能是一个更简单的方法。我也无法使用apply函数在多列中使用recode。有没有办法将Plyr或Dplyr软件包用于这种类型的多列重新编码?

同样,同时在列之间重命名相似因子的最简单方法是什么?例如,重命名“非常满意”到“外部坐”跨列1至3

难道我用的功能“应用”或“lapply”起来呢?

我已搜查和Google搜索的答案,什么似乎像它应该是R中相对容易的和常见的任务,但无法找到任何工作或足够简单,我听不懂。

任何建议将不胜感激!这也是我的第一个堆栈溢出后,所以让我知道我可以提高我的问题的格式,措辞等

谢谢! 迈克

+0

欢迎R和SO。这里是'替换'的方法http://stackoverflow.com/questions/28637880/renaming-factor-variables-if-a-condition-is-satisfied-in-separate-column和一个用''revalue'在这里http: //stackoverflow.com/questions/34221338/how-can-we-replace-elements-in-a-vector-in-r。如果您添加一些示例数据,您可能会收到更详细的帮助。 –

+0

如果你提供了一个[可重现的例子](如http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),那么帮助和提供特定的建议会容易得多, 。编写工作代码比简单地谈论代码或一般策略更容易。堆栈溢出是针对具体的问答,而不是一般的讨论。 – MrFlick

+0

谢谢您的意见和建议,他们是有帮助的。 – Mike

回答

0

您可以分配到factorlevels,使群体比较容易,同时保留factor结构。例如: -

df <- data.frame(replicate(3, factor(1:4,levels=1:4, 
       labels=c("extr.dis","dis","sat","extr.sat")))) 
df 

#  X1  X2  X3 
#1 extr.dis extr.dis extr.dis 
#2  dis  dis  dis 
#3  sat  sat  sat 
#4 extr.sat extr.sat extr.sat 

df[] <- lapply(df, function(x) { 
    levels(x)[levels(x) %in% c("extr.dis","dis")] <- "dissat" 
    levels(x)[levels(x) %in% c("sat","extr.sat")] <- "sat" 
    x 
}) 
df 

#  X1  X2  X3 
#1 dissat dissat dissat 
#2 dissat dissat dissat 
#3 sat sat sat 
#4 sat sat sat 
+0

感谢您花时间帮忙! – Mike

0

我们可以使用recodelibrary(car)(例如数据来自@ thelatemail的帖子)

library(car) 
df[] <- lapply(df, recode, 
      'c("extr.dis","dis")="dissat";"extr.sat"="sat"') 


df 
# X1  X2  X3 
#1 dissat dissat dissat 
#2 dissat dissat dissat 
#3 sat sat sat 
#4 sat sat sat 

str(df) 
#'data.frame': 4 obs. of 3 variables: 
# $ X1: Factor w/ 2 levels "dissat","sat": 1 1 2 2 
# $ X2: Factor w/ 2 levels "dissat","sat": 1 1 2 2 
# $ X3: Factor w/ 2 levels "dissat","sat": 1 1 2 2 
+0

非常感谢,这工作,并且是一个简单的解决方案! – Mike

+0

另一个快速问题。我之前通过使用levels(df $ Q1)< - c(“Newname1”,“Newname2”等)更改了因子名称,其中Q1是因子,“Newnames”是新的因子类别名称。我觉得这个快速而简单易用,但我只能用它来做一列。我如何跨多个具有相似因子名称的列应用此功能? – Mike

+0

另外,有没有办法通过使用“ifelse”或“if ... else”来实现上述结果(您对recode的问题的原始答案)?再次感谢! – Mike