2

我有多个数据集包含相同的变量名称但不同的值,我正在尝试创建一个名为的新变量group,该变量将区分每组数据集(我这样做是因为我会将所有数据集放在一个中,我可以通过团体)。这是 2 个数据集的示例。

################################
###       Sample data        ### 
################################

set.seed(8547)
a=sample(1:20,15,replace=FALSE)
a=sort(a)
f=runif(15,0,1)
f=sort(f)
trt1=data.frame(a,f)

set.seed(1452)
a=sample(1:35,22,replace=FALSE)
a=sort(a)
f=runif(22,0,1)
f=sort(f)
trt2=data.frame(a,f)

names_of_dataframes <- ls.str(mode = "list")

#  I used a `for` loop because i have approximatively `10` datasets and i do not know if the `apply` family would work for this kind of treatment

for (i in length(names_of_dataframes)) {
  if(names_of_dataframes[i]=="trt1"){
    trt1$group=rep("trt1",nrow(trt1))
  }else if (names_of_dataframes[i]=="trt2"){
    trt2$group=rep("trt2",nrow(trt2))
  }
      
}

我不知道我做错了什么,但该group变量仅是为数据集创建的,trt2而不是为trt1. 有什么想法有什么问题吗?

预先感谢您的帮助

4

1 回答 1

2

我们可以将所有数据集加载到一个listwithmgetls

lst1 <- mget(ls(pattern = '^trt\\d+$'))
lst1 <- Map(cbind, lst1, group = names(lst1))

如果需要更新原始对象,请使用list2env(虽然不推荐)

list2env(lst1, .GlobalEnv)

- 检查对象

head(trt1)
#  a          f group
#1 1 0.03676253  trt1
#2 2 0.07212860  trt1
#3 3 0.10711856  trt1
#4 4 0.14691670  trt1
#5 5 0.33626002  trt1
#6 6 0.41223646  trt1

head(trt2)
#  a          f group
#1 2 0.01003053  trt2
#2 3 0.05251810  trt2
#3 4 0.08916620  trt2
#4 5 0.17498162  trt2
#5 6 0.24118046  trt2
#6 8 0.24816209  trt2

或者另一种选择是assign

nm1 <- ls(pattern = '^trt\\d+$')
for(nm in nm1) {
     assign(nm, `[[<-`(get(nm), "group", value = nm))

}

或使用map/mutate

library(dplyr)
library(purrr)
map(nm1, ~ get(.x) %>%
         mutate(group = .x))
于 2021-02-06T18:25:33.620 回答