使用.SD和lapply清理数据表中的因子级别

时间:2018-04-10 10:35:44

标签: r data.table factors

此问题与此问题Cleaning up factor Levels collapsing multiple Level labels有关,但我想将其扩展到数据表并折叠数据表的列子集的因子级别。我总是在数据表中使用lapply ...

这是我的MWE以及我想分别使用level()分别对两列进行实现

df<-data.table(Index=1:3,factor1=c("Yes", "No", "0"), factor2=c("yes","no","no"))
str(df)
subset_factor<-c("factor1", "factor2")
label.yesno<- list("Yes" = c("Yes","yes"),
                   "No"   = c("No", "no"))
df[,(subset_factor):=lapply(.SD,factor),.SD=subset_factor]
str(df)

levels(df$factor1)<-label.yesno
levels(df$factor2)<-label.yesno
df

我希望在创建因子时可以直接使用列表

df[,(subset_factor):=lapply(.SD,factor, labels=label.yesno),.SD=subset_factor]

或者我可以以某种方式在另一个步骤中使用Levels因子..但我找不到任何类似的东西。我其实想要&#34; 0&#34;在我的MWE中完成转换为NA。

1 个答案:

答案 0 :(得分:1)

我认为您可以编写一个简单的辅助函数来简化此过程:

# df<-data.table(Index=1:3,factor1=c("Yes", "No", "0"), factor2=c("yes","no","no"))
# str(df)
# subset_factor<-c("factor1", "factor2")
# label.yesno<- list("Yes" = c("Yes","yes"),
#                    "No"   = c("No", "no"))

f <- function(x, lab){
    res <- factor(x)
    levels(res) <- lab
    res
}
df[, (subset_factor) := lapply(.SD, f, lab = label.yesno), .SDcols = subset_factor]