R - 需要从因子更改多个表中的列

时间:2015-05-14 02:59:26

标签: r

我有一个向量c("d1","d2","d3"),其中d1,d2,d3是数据表。它们中的每一个都有一个名为ID的列,它是一个因子变量。我需要在d1,d2,d3表中将所有ID列从因子转换为字符。

我已经尝试了以下内容:

  d<-c("d1","d2","d3")
  #[1]
  invisible(lapply(d,function(x){get(x)[["ID"]]<-as.character(get(x)[["ID"]])}))
  #[2]
  invisible(lapply(d,function(x){get(x)[,list(ID)] <- as.character(get(x)[,list(ID)])}))

请注意,我不想将其他因子列从d1,d2,d3转换为ID以外的字符列。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

这是您可以尝试的方法。它使用list2env(很多人会明智地建议反对)来替换.GlobalEnv中的对象。

该方法适用于data.framedata.table,但如果使用data.table s,最好使用其他方法。

d1 <- d2 <- d3 <- data.frame(ID = c("A", "B"), num = 1:2)
library(data.table)
d3 <- as.data.table(d1)[, ID := factor(ID)]
d1
#   ID num
# 1  A   1
# 2  B   2
str(d1)
# 'data.frame': 2 obs. of  2 variables:
#  $ ID : Factor w/ 2 levels "A","B": 1 2
#  $ num: int  1 2
str(d3)
# 'Classes ‘data.table’ and 'data.frame':   2 obs. of  2 variables:
#  $ ID : Factor w/ 2 levels "A","B": 1 2
#  $ num: int  1 2
#  - attr(*, ".internal.selfref")=<externalptr> 

list2env(lapply(mget(c("d1","d2","d3")), 
                function(x) { x[["ID"]] <- as.character(x[["ID"]]) ; x}), 
         .GlobalEnv)
str(d1)
# 'data.frame': 2 obs. of  2 variables:
#   $ ID : chr  "A" "B"
#   $ num: int  1 2
str(d3)
# Classes ‘data.table’ and 'data.frame':    2 obs. of  2 variables:
#   $ ID : chr  "A" "B"
#   $ num: int  1 2
#   - attr(*, ".internal.selfref")=<externalptr> 

如果您使用data.table ,则可以跳过list2env部分:

library(data.table)
d1 <- d2 <- d3 <- data.table(ID = factor(c("A", "B")), num = 1:2)
str(d1)
# 'Classes ‘data.table’ and 'data.frame':   2 obs. of  2 variables:
#  $ ID : Factor w/ 2 levels "A","B": 1 2
#  $ num: int  1 2
#  - attr(*, ".internal.selfref")=<externalptr> 

lapply(mget(c("d1","d2","d3")), function(x) x[, ID := as.character(ID)][])
str(d1)
# Classes ‘data.table’ and 'data.frame':    2 obs. of  2 variables:
#   $ ID : chr  "A" "B"
#   $ num: int  1 2
#   - attr(*, ".internal.selfref")=<externalptr>