使用列表中的数据框:删除变量,添加新变量

Fre*_*red 4 r data-manipulation lapply data-management

使用两个数据帧df1df2定义列表dats

dats <- list( df1 = data.frame(a=sample(1:3), b = sample(11:13)),
    df2 = data.frame(a=sample(1:3), b = sample(11:13)))

> dats
$df1
  a  b
1 2 12
2 3 11
3 1 13

$df2
  a  b
1 3 13
2 2 11
3 1 12
Run Code Online (Sandbox Code Playgroud)

我想在每个数据框中删除变量a.接下来,我想添加一个变量,其中包含来自外部数据帧的每个数据帧的id,如:

ids <- data.frame(id=c("id1","id2"),df=c("df1","df2"))
> ids
  id  df
1 id1 df1
2 id2 df2
Run Code Online (Sandbox Code Playgroud)

为了放弃不必要的变量,我试着没有运气:

> dats <- lapply(dats, function(x) assign(x, x[,c("b")]))  
> Error in assign(x, x[, c("b")]) : invalid first argument
Run Code Online (Sandbox Code Playgroud)

不知道如何添加id.

我也尝试过,或许更合适:

> temp <- lapply(dats, function(x) subset(x[1], select=x[[1]]$b))
Error in x[[1]]$b : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)

我觉得令人困惑的是str(out[1])返回一个列表,str(out[[1]])返回一个数据帧.我认为这可能与它有关.

Pra*_*ani 5

或者尝试这个:将您ids的数据框名称映射到id的命名向量:

df2id <- ids$id
names(df2id) <- ids$df

> df2id
df1 df2 
id1 id2 
Levels: id1 id2
Run Code Online (Sandbox Code Playgroud)

然后使用mapply(a)a从每个数据框中删除列,以及(b)添加id列:

> mapply( function(d,x) cbind( subset(d, select = -a),
+                              id = x),
+         dats, df2id[ names(dats) ] ,
+         SIMPLIFY=FALSE)
$df1
   b  id
1 12 id1
2 11 id1
3 13 id1

$df2
   b  id
1 12 id2
2 11 id2
3 13 id2
Run Code Online (Sandbox Code Playgroud)

请注意,我们传递df2id[ names(dats) ]mapply- 这确保了数据帧与数据帧df2id"对齐" dats.