Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:向dataframes添加一个新变量,其值等于dataframes的名称_R_Variables_Conditional - Fatal编程技术网

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)
}
这将产生同样的结果