Работа с фреймами данных в списке: удаление переменных, добавление новых - PullRequest
4 голосов
/ 19 июня 2011

Определить список 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 в каждом кадре данных. Затем я хотел бы добавить переменную с идентификатором каждого кадра данных из внешнего кадра данных, например:

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

Не уверен, как добавить идентификатор тоже.

Я тоже пытался, возможно, более уместно:

> 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]]) возвращает фрейм данных. Я думаю, что это как-то связано с этим.

Ответы [ 2 ]

5 голосов
/ 19 июня 2011

Или попробуйте это: Извлеките ваш 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.

2 голосов
/ 19 июня 2011

Это нормально?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...