【问题标题】:Change level of multiple factor variables多因子变量的变化水平
【发布时间】:2013-10-08 21:19:12
【问题描述】:

大家-

我想先说我已经查看了此链接以尝试解决我的问题:

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', ??))

我不知道用什么代替问号。我尝试只使用“levels [-1]”,但很明显为什么这不起作用。我也尝试过“levels(df[64:88])[-1]”,但还是不行。所以我尝试用以下代码修改代码:

df[64:88] <- lapply(df[64:88], function(x) levels(x)[levels(x) == ' '] <- 'Unknown')

但每当我调用levels$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 给出示例数据的标准是什么。此外,这段 sn-p 代码也可能有所帮助:

> 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 标准。谢谢!

【问题讨论】:

  • 当前关卡是空格还是NA?你能提供一个最小的reproducible example吗?
  • 当前级别是空格,不是NA。 Henrik 在下面提供了一个很好的可重现示例,完美地说明了我的数据。

标签: r multiple-columns lapply r-factor


【解决方案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"

【讨论】:

  • 我尝试使用这个解决方案,当我调用levels(df$transaction_type1) 时,我得到的是“character(0)”而不是NULL。我不明白为什么它适用于您的示例而不是我的示例,因为您的示例数据就是我的数据的样子......
  • 如果没有可重复的数据,很难说出它为什么不起作用。这就是为什么将它包含在问题中如此重要的原因。除了明显的论点之外,这是对您期望花时间帮助您的人的礼貌;)。显然 something 您的数据和我的最小示例之间的结构有所不同。
猜你喜欢
  • 2015-10-04
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多