apply()不分配值

时间:2015-05-10 22:14:05

标签: r apply

我有16列数据框的子集。它们都是因素,具有相同的级别和标签。我试图使用其中一个apply()函数一次分配级别和标签,但我的功能是打印结果而不是将它们分配给数据框。我可以单独写出它们 - 只有16个 - 但我后来有更大的变量组来制作因子,所以这会为我节省很多工作。

示例数据:

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 article因此使用了<<-而不是<-,但无济于事,我也尝试了assign()但没有运气。< / p>

感谢。

2 个答案:

答案 0 :(得分:3)

如@DavidArenburg所述,有更好的方法可以做到这一点。

如果您真的在factor之后,那么您可以按@David推荐:

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

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

如果你最关心的只是获得这些值的字符表示,你可以尝试不同的东西,如:

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

答案 1 :(得分:1)

我认为,当简单的子集可能更容易实现时,您可能会尝试使用基于apply()的方法:

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

如果你有一个更长的重新编码列表,你可以很容易地把它放在你的查找值向量和替换向量的循环中。