每个人 -
我想通过说我已经看过这个链接试图解决我的问题来作为序言:
Applying the same factor levels to multiple variables in an R data frame
不同之处在于,在该问题中,OP希望改变所有具有相同水平的因子水平。在我的实例中,我希望将第一个级别(设置为'')更改为“未知”,并将其余级别单独保留。我知道我可以用“非R”方式做到这一点:
for (i in 64:88) {
var.name <- colnames(df[i])
levels(eval(parse(text=paste('df$', var.name, sep=''))))[levels(eval(parse(text=paste('df$', var.name, sep='')))) == ' '] <- 'Unknown'
}
但这是一种效率低下的方法。尝试使用上面链接的问题中提出的方法给了我这个代码:
df[64:88] <- lapply(df[64:88], factor, levels=c('Unknown', ??))
我不知道该用什么来代替问号。我尝试使用“级别[-1]”,但很明显为什么这不起作用。我也试过“水平(df [64:88])[ - 1]”,但再次没有好处。所以我尝试使用以下代码修改代码:
df[64:88] <- lapply(df[64:88], function(x) levels(x)[levels(x) == ' '] <- 'Unknown')
但每当我调用level $ transaction_type1(其中transaction_type1是df [64]的列名)时,我就会得到NULL。
我在这里缺少什么?
提前感谢您的帮助!
根据几个请求,这是我的数据示例:
df$transaction_type1[1:100]
[1]
[13] HOME RENEW
[25]
[37]
[49]
[61] AUTO MANAGE AUTO RENEW
[73] AUTO MANAGE AUTO RENEW
[85]
[97]
Levels: AUTO CLAIM AUTO MANAGE AUTO PURCHASE AUTO RENEW HOME CLAIM HOME RENEW
正如你所看到的,有很多值等于'',所有25个变量看起来都像这样,但是有不同的级别。我的数据由222个变量和24,850行组成,因此我不知道SO上提供示例数据的标准是什么。此外,这段代码也可能有所帮助:
> levels(df$transaction_type1)
#[1] " " "AUTO CLAIM" "AUTO MANAGE" "AUTO PURCHASE" "AUTO RENEW" "HOME CLAIM" "HOME RENEW"
> levels(df$transaction_type1)[levels(df$transaction_type1) == ' '] <- 'Unknown'
> levels(df$transaction_type1)
#[1] "Unknown" "AUTO CLAIM" "AUTO MANAGE" "AUTO PURCHASE" "AUTO RENEW" "HOME CLAIM" "HOME RENEW"
如果需要更多信息,请告诉我,以便我可以提供,并了解寻求帮助的SO标准。谢谢!
答案 0 :(得分:1)
这样的东西?
# it seems like your original data has a structure like this
df <- data.frame(x = factor(c("a", "", "b"), levels = c("", "a", "b")),
y = factor(c("c", "", "d"), levels = c("", "c", "d")))
lapply(df, levels)
# $x
# [1] "" "a" "b"
#
# $y
# [1] "" "c" "d"
# change the "" level to "unknown", and return the updated vector
df[] <- lapply(df, function(x){
levels(x)[levels(x) == ""] <- "unknown"
x
})
lapply(df, levels)
# $x
# [1] "unknown" "a" "b"
#
# $y
# [1] "unknown" "c" "d"