R:向dataframes添加一个新变量,其值等于dataframes的名称
我想向全局环境中的所有数据帧添加一个变量,并使新添加的列的值等于数据帧名称R:向dataframes添加一个新变量,其值等于dataframes的名称,r,variables,conditional,R,Variables,Conditional,我想向全局环境中的所有数据帧添加一个变量,并使新添加的列的值等于数据帧名称 Product=c("A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","C") Day=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
Product=c("A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","C")
Day=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Saturday","Sunday" ,"Monday")
data1=data.frame(Product, Day)
Product2=c("Z","Z","Z","Z","Z","Z","Z","Z","Z","Z","Z","Z","Y","Y","Y","X","X","X")
Day2=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Saturday","Sunday" ,"Monday")
data2=data.frame(Product2, Day2)
我想在两个数据帧中都添加一列,其值等于数据帧名称,即对于数据1,newvar=data1;对于数据2,newvar=data2。我的实际数据帧列表比这个长得多
非常感谢您的帮助
谢谢 如果'data.frame'对象名是'data'后跟数字,如果我们已经知道对象名,我们可以使用“粘贴”将对象名作为字符串获取
nm1 <- paste0('data', 1:2)
使用mget获取列表中的值,并通过使用Map绑定来创建一个新列“newvar”。使用映射确保列表中的每个数据集都添加了与对象名称对应的新列
lst <- Map(cbind, mget(nm1), newvar= nm1)
直接读取列表中的所有文件.csv/.txt,而不是创建单个对象,可能也很有用。例如,我们可以通过以下方式读取工作目录中的所有文件:
files <- list.files()
lst <- lapply(files, read.csv, stringsAsFactors=FALSE)
参数可能需要根据分隔符进行一些更改。如果'data.frame'对象名称是'data'后跟数字,如果我们已经知道对象名称,则可以使用“粘贴”将对象名称作为字符串获取
nm1 <- paste0('data', 1:2)
使用mget获取列表中的值,并通过使用Map绑定来创建一个新列“newvar”。使用映射确保列表中的每个数据集都添加了与对象名称对应的新列
lst <- Map(cbind, mget(nm1), newvar= nm1)
直接读取列表中的所有文件.csv/.txt,而不是创建单个对象,可能也很有用。例如,我们可以通过以下方式读取工作目录中的所有文件:
files <- list.files()
lst <- lapply(files, read.csv, stringsAsFactors=FALSE)
参数可能需要根据分隔符进行一些更改。这里有一个函数,您可以在其中传递任意数量的命名data.frames,它将返回命名data.frames列表,并添加请求的列。使用@akrun的答案中的list2env函数,您可以将它们放在您想要的任何环境中。您还可以修改该函数以自动产生该副作用
f <- function(...) {
objnames <- as.character(substitute(c(...)))[-1]
obj <- list(...)
out <- mapply(function(x, col) {
x[, col] <- col
x
}, obj, objnames, SIMPLIFY = FALSE)
setNames(out, objnames)
}
这将产生相同的结果。这里有一个函数,您可以在其中传递任意数量的命名data.frames,它将返回一个命名data.frames列表,并添加请求的列。使用@akrun的答案中的list2env函数,您可以将它们放在您想要的任何环境中。您还可以修改该函数以自动产生该副作用
f <- function(...) {
objnames <- as.character(substitute(c(...)))[-1]
obj <- list(...)
out <- mapply(function(x, col) {
x[, col] <- col
x
}, obj, objnames, SIMPLIFY = FALSE)
setNames(out, objnames)
}
这将产生同样的结果