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

Определить:

> dats <- list( df1 = data.frame(a=sample(1:3), b = as.factor(rep("325.049072M",3))),
+       df2 = data.frame(a=sample(1:3), b = as.factor(rep("325.049072M",3))))
> dats
$df1
  a           b
1 3 325.049072M
2 2 325.049072M
3 1 325.049072M

$df2
  a           b
1 2 325.049072M
2 1 325.049072M
3 3 325.049072M

Я хочу удалить символ М из столбца b в каждом фрейме данных.

В простой структуре:

> t<-c("325.049072M","325.049072M")
> t
[1] "325.049072M" "325.049072M"
> t <- substr(t, 1, nchar(t)-1)
> t
[1] "325.049072" "325.049072"

Ново вложенном, как поступить?Вот одна неудачная попытка:

> dats <- list( df1 = data.frame(a=sample(1:3), b = as.factor(rep("325.049072M",3))),
+       df2 = data.frame(a=sample(1:3), b = as.factor(rep("325.049072M",3))))
> dats
$df1
  a           b
1 3 325.049072M
2 1 325.049072M
3 2 325.049072M

$df2
  a           b
1 2 325.049072M
2 3 325.049072M
3 1 325.049072M

> for(i in seq(along=dats)) {
+   dats[[i]]["b"] <- 
+           substr(dats[[i]]["b"], 1, nchar(dats[[i]]["b"])-1)
+ }
> dats
$df1
  a         b
1 3 c(1, 1, 1
2 1 c(1, 1, 1
3 2 c(1, 1, 1

$df2
  a         b
1 2 c(1, 1, 1
2 3 c(1, 1, 1
3 1 c(1, 1, 1

Ответы [ 3 ]

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

Попробуйте использовать gsub вместо substr - как-то так:

lapply(<data.frame or list>, function(x) as.numeric(gsub("M$", "", x)))

конечно, вам нужно выяснить, как вы собираетесь использовать элементы списка и т. Д., Но я думаю, вы получите картину ...

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

Вы можете сделать это с помощью lapply (и некоторого принуждения):

stripM <- function(x){
x$b <- substr(as.character(x$b),1,nchar(as.character(x$b))-1)
x
}
lapply(dats,FUN=stripM)

Если вам нужна эта переменная как фактор, вы можете включить в stripM строку, которая преобразует обратно в фактор, что-то вроде x$b <- as.factor(x$b).

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

Хорошо, вот еще одна возможность, не аккуратная, но вразумительная:

for(i in seq(along=dats)) {
    c <- as.character(dats[[i]][["b"]])
    c <- substr(c, 1, nchar(c)-1)
    dats[[i]][["b"]] <- c
    dats
}
dats

Я должен сказать, что нахожу целые [[ против [ ссылки очень загадочными.

> str(dats[[i]][["b"]])
 chr [1:3] "325.049072" "325.049072" "325.049072"
> str(dats[[i]]["b"])
'data.frame':   3 obs. of  1 variable:
 $ b: chr  "325.049072" "325.049072" "325.049072"

Я продолжаю методом проб и ошибок. Любые указатели на хорошее объяснение?

...