2015-05-10 89 views
1

我有一个16列数据框的子集。它们都是因素,具有相同的级别和标签。我正尝试使用apply()函数之一来一次性分配关卡和标签,但我的功能是打印结果而不是将它们分配给数据框。我可以把它们全部写出来 - 只有16个 - 但后来我有更多的变量组来制作因素,这样可以为我节省很多工作。apply()不分配值

实施例的数据:

df <- structure(list(col1 = c(0L, 1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 
1L), col2 = c(0L, 0L, -1L, 0L, -1L, -1L, 1L, 0L, 0L, 1L), col3 = c(-1L, 
1L, 1L, -1L, 0L, 1L, 0L, 0L, -1L, -1L), col4 = c(0L, 0L, 0L, 
1L, 1L, 0L, 0L, 1L, 1L, 0L), col5 = c(-1L, -1L, 0L, 1L, 0L, 0L, 
1L, -1L, 0L, 1L)), .Names = c("col1", "col2", "col3", "col4", 
"col5"), row.names = c(NA, -10L), class = "data.frame") 

有了这个数据我试着:

levels <- -1:1 
labels <- c("Don't know", "Not mentioned", "Mentioned") 
lapply(as.list(1:5), function(x){ 
    df[, x] <<- factor(df[, x], levels = levels, labels = labels) 
}) 

这将打印的每个变量,而不是将其分配给原始数据帧,并且也正确地使所有的细胞NA 。显然我做错了什么,但我看不出什么(也许我没有足够的咖啡)。

我的问题是:如何将水平和标签同时分配给多个变量,可能需要使用xapply()函数。

我见过this post on R Bloggers所以使用了<<-代替<-但无济于事,我也试着assign()没有运气,无论是。

谢谢。

+0

当我运行代码,我得到包含值“一个数据帧不知道“,”未提及“,”已提及“。这不是你想要达到的目标吗?原始'df'中的值将被3个字符串值覆盖。 –

+3

从函数内部修改全局环境正在寻求麻烦。您可以改为使用'df [] < - lapply(df,factor,levels = levels,labels = labels)'。 –

+0

感谢您的关注。我提供的可重复的例子是使用你的建议,而我的实际数据不是。我将着眼于此,也许修改我的示例数据或尝试找出为什么我的实际数据不起作用。理想情况下,我是在追求因素。 – Phil

回答

3

正如@DavidArenburg所说,有更好的方法来做到这一点。

如果后factor s为真,那么你可以做@大卫建议:

df[] <- lapply(df, factor, levels = levels, labels = labels) 

[]保留了输入的结构,同时指定从函数的返回值/ s的已应用。


如果您主要关注的是刚开这些值的字符表示,你可以尝试不同的东西,像这样:

df[] <- labels[match(unlist(indf), levels)] 
+0

谢谢,我可以稍微修改这些以更改我的原始数据集。我使用了'df [] < - lapply(df [,a:b],因子,levels = levels,labels = labels',其中'a:b'是分配给相关列号的值 – Phil

+0

@Phil,它应该是'df [a:b] < - lapply(df [a:b],...)',对吗?(我忽略了逗号,因为你处理的是'data.frame'而不是'矩阵',所以这个逗号不是必须的*(尽管它也没有伤害) – A5C1D2H2I1M1N2O1R2T1

+0

实际上,除了'df [,a:b] < - ...'以外, 3,000个可变数据集)。 – Phil

1

我想你可能会试图太难使用apply()基础的方法时,简单的子集可能更容易实现:

df[,][df[,] == -1] <- "Don't Know" 
df[,][df[,] == 0] <- "Not Mentioned" 
df[,][df[,] == 1] <- "Mentioned" 

如果你不得不重新编写过多个值的长列表,你可以很容易地把这在你的查找值向量和替换向量的循环中。

+0

这是一个非常优雅的解决方案,非常值得投票!我将'apply'解决方案标记为已接受,因为这在技术上是所问问题的答案,但这可能是对我实际问题的更好解决方案,所以我可能会使用此方法。谢谢! – Phil