为列表中的每个data.frame元素分配唯一的ID

时间:2019-04-11 18:22:47

标签: r list loops dataframe unique

我有很多(空间)数据框架的列表。我想为每个data.frame添加一列,其ID等于列表索引ID(即每个data.frame的新列中的每一行都具有相同的ID)。

我认为我必须与cbind一起使用一些apply函数,但是我不知道如何为列表中的每个元素(尤其是Spatial data.frames元素)设置其格式。请帮忙!

以下是一些可使用的示例代码:

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)

我想结束以下内容:

[[1]]
  y1 y2 unique.id
1  1  4  1
2  2  5  1
3  3  6  1

[[2]]
  y1 y2 unique.id
1  3  6  2
2  2  5  2
3  1  4  2

6 个答案:

答案 0 :(得分:3)

尝试:

newlist <- Map(cbind,my.list, unique.id = (1:length(my.list)))

答案 1 :(得分:1)

您可以使用let query = `SELECT dept_id, dept_name, over_head_costs, product_sales) AS product_sales, product_sales - over_head_costs AS profit FROM departments`; connection.query(query, (err, res) => { if (err) throw err; console.log(res);

replace

或更短

lapply(seq_along(my.list), 
       function(x) setNames(replace(my.list[[x]], ncol(my.list[[x]]) + 1, x), 
                            c(names(my.list[[x]]), "unique.id")))
# [[1]]
#   y1 y2 unique.id
# 1  1  4         1
# 2  2  5         1
# 3  3  6         1
# 
# [[2]]
#   y1 y2 unique.id
# 1  3  6         2
# 2  2  5         2
# 3  1  4         2

答案 2 :(得分:1)

您可以通过mapply-

完成此操作
> mapply(function(x, y) "[<-"(x, "ID", value = y) , my.list, 1:length(my.list), SIMPLIFY = FALSE)

OR

> mapply(cbind, my.list, "SampleID"=1:length(my.list), SIMPLIFY=F)

[[1]]

$`1`
  y1 y2 ID
1  1  4  1
2  2  5  1
3  3  6  1

$`2`
  y1 y2 ID
1  3  6  2
2  2  5  2
3  1  4  2

答案 3 :(得分:1)

这是使用for循环的一种方式

for (i in seq_along(my.list)) {
  my.list[[i]] <- data.frame(my.list[[i]], "unique.id" = i)
}

> my.list
[[1]]
  y1 y2 unique.id
1  1  4         1
2  2  5         1
3  3  6         1

[[2]]
  y1 y2 unique.id
1  3  6         2
2  2  5         2
3  1  4         2

答案 4 :(得分:1)

与Mike和Rushabh的相似:

mapply(FUN = function(x, y) {
  x$unique.id <- y
  x
}, x = my.list, y = 1:length(my.list), SIMPLIFY = FALSE)

答案 5 :(得分:0)

我们可以将列表折叠为具有 id 的单个 dataframe ,然后再次 split

library(data.table)

x <- rbindlist(my.list, idcol = "unique.id")
#    unique.id y1 y2
# 1:         1  1  4
# 2:         1  2  5
# 3:         1  3  6
# 4:         2  3  6
# 5:         2  2  5
# 6:         2  1  4
my.list <- split(x, x$unique.id)
# $`1`
#    unique.id y1 y2
# 1:         1  1  4
# 2:         1  2  5
# 3:         1  3  6
# 
# $`2`
#    unique.id y1 y2
# 1:         2  3  6
# 2:         2  2  5
# 3:         2  1  4