使用两个数据框定义列表 dats , df1 和 df2
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
我想在每个数据框中删除变量 a 。接下来,我想添加一个变量,其中包含来自外部数据帧的每个数据帧的id,如:
ids <- data.frame(id=c("id1","id2"),df=c("df1","df2"))
> ids
id df
1 id1 df1
2 id2 df2
为了放弃不必要的变量,我试了一下没有运气:
> dats <- lapply(dats, function(x) assign(x, x[,c("b")]))
> Error in assign(x, x[, c("b")]) : invalid first argument
不确定如何添加ID。
我也尝试过,或许更合适:
> temp <- lapply(dats, function(x) subset(x[1], select=x[[1]]$b))
Error in x[[1]]$b : $ operator is invalid for atomic vectors
我觉得令人困惑的是str(out[1])
返回一个列表,str(out[[1]])
返回一个数据帧。我认为这可能与它有关。
答案 0 :(得分:5)
或尝试这样做:将ids
提取到一个命名向量中,该向量将数据框架名称映射到id:
df2id <- ids$id
names(df2id) <- ids$df
> df2id
df1 df2
id1 id2
Levels: id1 id2
然后使用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
请注意,我们正在将df2id[ names(dats) ]
传递给mapply
- 这可确保df2id
中的数据框与dats
中的数据框“对齐” 。
答案 1 :(得分:2)
这样可以吗?
dats <- list( df1 = data.frame(a=sample(1:3), b = sample(11:13)),
df2 = data.frame(a=sample(1:3), b = sample(11:13)))
ids <- data.frame(id=c("id1","id2"),df=c("df1","df2"))
# remove variable a
dats2 <- lapply(dats, function(x) x[,!names(x) == "a"])
# add id
for(i in 1:length(dats2)) {
dats2[[i]] <- merge(dats2[[i]], ids$id[ids$df == names(dats2)[i]])
}
dats2
$df1
x y
1 11 id1
2 12 id1
3 13 id1
$df2
x y
1 11 id2
2 12 id2
3 13 id2