我有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>
感谢。
答案 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"
如果你有一个更长的重新编码列表,你可以很容易地把它放在你的查找值向量和替换向量的循环中。