向列表中的每个数据框附加一列

Appending a column to each data frame within a list

我有一个数据框列表,想为每个数据框附加一个新列,但是我不断收到各种错误消息。谁能解释为什么下面的代码对我不起作用?如果 rowid_to) 列工作正常,我会很高兴,因为我的实际集合中的数据排序正确,否则我想要一个新列,其中的列表来自 1:length(data$data)

##dataset
data<- tibble(Location = c(rep("London",6),rep("Glasgow",6),rep("Dublin",6)),
              Day= rep(seq(1,6,1),3),
              Average = runif(18,0,20),
              Amplitude = runif(18,0,15))%>%
  nest_by(Location)

###map + rowid_to_column
attempt1<- data%>%
  map(.,rowid_to_column(.,var = "hour"))

##mutate
attempt2<-data %>%
  map(., mutate("Hours" = 1:6))

###add column
attempt3<- data%>%
  map(.$data,add_column(.data,hours = 1:6))

newcolumn<- 1:6

###lapply
attempt4<- lapply(data,cbind(data$data,newcolumn))

非常感谢, 斯图尔特

一种data.table方法

library(data.table)
setDT(data)
data[, data := lapply(data, function(x) cbind(x, new_col = 1:6))]

data$data
# [[1]]
#   Day   Average  Amplitude test new_col
# 1   1 11.139917  0.3690539    1       1
# 2   2  5.350847  7.0925508    2       2
# 3   3  9.602104  6.1782818    3       3
# 4   4 14.866074 13.7356913    4       4
# 5   5  1.114201  1.1007080    5       5
# 6   6  2.447236  5.9944926    6       6
# 
# [[2]]
#   Day   Average Amplitude test new_col
# 1   1 17.230213 13.966576    1       1
# .....

您的基本 R 尝试已接近完成,但您想迭代 data$data,这是一个数据帧列表。

data$data  <- lapply(data$data, function(x) {
    hour  <- seq_len(nrow(x))
    cbind(x, hour)
})

data$data

# [[1]]
#   Day   Average Amplitude hour
# 1   1  6.070539  1.123182    1
# 2   2  3.638313  8.218556    2
# 3   3 11.220683  2.049816    3
# 4   4 12.832782 14.858611    4
# 5   5 12.485757  7.806147    5
# 6   6 19.250489  6.181270    6

编辑:更新后意识到它是在列而不是行上迭代。如果数据帧具有不同的行数,则此方法将起作用,而向量定义为 1:6 的方法将不起作用。

一个purrr方法:

data<- tibble(Location = c(rep("London",6),rep("Glasgow",6),rep("Dublin",6)),
              Day= rep(seq(1,6,1),3),
              Average = runif(18,0,20),
              Amplitude = runif(18,0,15))%>%
  group_split(Location) %>% 
  purrr::map_dfr(~.x %>% mutate(Hours = c(1:6)))

如果你想使用你的方法并保留相同的数据结构,这是再次使用purrr的方法(你需要取消分组,否则由于按行分组将无法工作)

data %>% ungroup() %>%
  mutate_at("data", .f = ~map(.x, ~.x %>% mutate(Hours = c(1:6))) )