apply() 不赋值

apply() not assigning values

我有一个 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 post on R Bloggers 所以用了 <<- 而不是 <- 但无济于事,我也试过 assign() 也没有成功.

谢谢。

我认为您可能过于努力地尝试使用基于 apply() 的方法,而简单的子集化可能更容易实现:

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

如果您有更长的多个值重新编码列表,您可以轻松地将其放入查找值向量和替换向量的循环中。

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

如果你真的在factors之后,那么你可以按照@David的建议去做:

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

[] 保留输入的结构,同时分配从您应用的 function/s 返回的值。


如果您最关心的只是获取这些值的字符表示,您可以尝试不同的方法,例如:

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