根据 R 中数据集的名称创建一个新变量
create a new variable based on the name of the dataset in R
我有多个包含相同名称但不同值的变量的数据集,我正在尝试创建一个名为 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
创建。有什么想法吗?
提前感谢您的帮助
我们可以使用 mget
和 ls
将所有数据集加载到 list
中
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))
我有多个包含相同名称但不同值的变量的数据集,我正在尝试创建一个名为 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
创建。有什么想法吗?
提前感谢您的帮助
我们可以使用 mget
和 ls
list
中
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))