我有一个由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()
函数。
我见过这篇关于R博客的文章,所以使用了<<-
而不是<-
,但是没有用,我也尝试过assign()
,但没有成功。
谢谢。
发布于 2015-05-11 02:18:32
正如@DavidArenburg所提到的,有更好的方法来做到这一点。
如果您真的喜欢factor
,那么您可以按照@David推荐的那样做:
df[] <- lapply(df, factor, levels = levels, labels = labels)
[]
保留输入的结构,同时分配您应用的函数/s返回的值。
如果您主要关心的是获取这些值的字符表示,您可以尝试一些不同的方法,如:
df[] <- labels[match(unlist(indf), levels)]
发布于 2015-05-11 01:38:15
我认为您可能太过努力地使用基于apply()
的方法,而简单的子设置可能更容易实现:
df[,][df[,] == -1] <- "Don't Know"
df[,][df[,] == 0] <- "Not Mentioned"
df[,][df[,] == 1] <- "Mentioned"
如果对多个值有较长的重新编码列表,则可以轻松地将其放在查找值向量和替换向量的循环中。
https://stackoverflow.com/questions/30157202
复制相似问题