Как перебрать несколько наборов данных, удаляя определенные символы из указанных столбцов в r - PullRequest
0 голосов
/ 20 сентября 2018

У меня 25 наборов данных, каждый из которых структурирован одинаково.Каждый содержит много строк и 7 столбцов.Столбец 6 содержит данные, которые должны быть числовыми, но не числовыми.Они не являются числовыми, потому что числа содержат запятые, т. Е. 100000 - это 100 000.

Я могу вручную разрешить это в каждом наборе данных, удалив запятую, а затем указав, что данные являются числовыми, используя следующий код

df$column_6 <- gsub("[,]" , "", df$column_6)
df$column_6 <- as.numerical(df$column_6)

Тем не менее, поскольку существует 25 наборов данных, я бы хотел сделать их циклически, но я не могу этого сделать.

Кроме того, поскольку столбец 6 имеет разные имена в каждом наборе данных, я бы предпочелукажите столбец 6, не используя его имя, как показано ниже

df[6] <- gsub("[,]" , "", df[6])

, однако это не похоже на работу.

Мой код выглядит следующим образом

list_of_dfs = c(df1, df2, ..... , df25)

for (i in list_of_dfs) {
  i[6] <- gsub("[,]" , "", i[6])
  i[6] <- as.numerical(i[6])
}

У кого-нибудь естьлюбой совет о том, как это сделать

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Путь к таблице данных

test<-data.table(col1=c('100,00','100','100,000'),col2=c('90','80,00','60'))
    col1  col2
 100,00    90
 100      80,00
 100,000  60

ваш список фреймов данных

testList<-list(test,test)

предполагается, что вы хотите исправить col2 в этом случае, но хотите использовать индекс в качестве ссылки

removeNonnumeric<-function(x){return(as.numeric(gsub(',','',x)))}
data<-function(x){return(x[,lapply(.SD,removeNonnumeric),.SDcols=names(x)[2],by=col1])}

removeNonnumeirc удаляет «,» из столбцов, а data обращается к каждой таблице данных в testList и вызывает для них «removeNonnumeric», выводит список таблиц данных, которыесоздается путем слияния этих двух функций в «lapply»

 lapply(testList,data)
0 голосов
/ 20 сентября 2018

Попробуйте это.Вы помещаете все кадры данных в список, а затем делаете столбец числовым.Вместо gsub я использую readr::parse_number.Я также включу тренировочный набор для иллюстрации.

library(tidyverse)

df1 <- data_frame(id = rep(1,3), num = c("10,000", "11,000", "12,000"))
df2 <- data_frame(id = rep(2,3), num = c("13,000", "14,000", "15,000"))
df3 <- data_frame(id = rep(3,3), num = c("16,000", "17,000", "18,000"))

list(df1, df2, df3) %>% map(~mutate(.x, num = parse_number(num)))
#> [[1]]
#> # A tibble: 3 x 2
#>      id   num
#>   <dbl> <dbl>
#> 1     1 10000
#> 2     1 11000
#> 3     1 12000
#> 
#> [[2]]
#> # A tibble: 3 x 2
#>      id   num
#>   <dbl> <dbl>
#> 1     2 13000
#> 2     2 14000
#> 3     2 15000
#> 
#> [[3]]
#> # A tibble: 3 x 2
#>      id   num
#>   <dbl> <dbl>
#> 1     3 16000
#> 2     3 17000
#> 3     3 18000

Создано в 2018-09-20 пакетом Представить (v0.2.0).

0 голосов
/ 20 сентября 2018

Ваш код близок, но есть несколько проблем:

  • результат никогда не будет возвращен в список.
  • as.numerical является опечаткой, она должна быть as.numeric
  • i[6] не работает, потому что вам нужно указать, что это 6-й столбец, который вы хотите: i[, 6]. Подробнее о [ против [[.
  • c(df1, df2) здесь не создается список фреймов данных

Попробуйте вместо этого:

## this is bad, it will make a single list of columns, not of data frames
# list_of_dfs = c(df1, df2, ..... , df25)

# use this instead
list_of_dfs = list(df1, df2, ..... , df25)
# or this
list_of_dfs = mget(ls(pattern = "df"))

for (i in seq_along(list_of_dfs)) {
  list_of_dfs[[i]][, 6] <- as.numeric(gsub("[,]" , "", list_of_dfs[[i]][, 6]))
}

Мы можем сделать немного лучше, gsub по умолчанию использует регулярные выражения для сопоставления с образцом, вместо этого использование аргумента fixed = TRUE будет немного быстрее:

for (i in seq_along(list_of_dfs)) {
  list_of_dfs[[i]][, 6] <- as.numeric(gsub(",", "", list_of_dfs[[i]][, 6], fixed = TRUE))
}

И мы могли бы использовать lapply вместо for петли для немного более короткого кода:

list_of_dfs[[i]] <- lapply(list_of_dfs, function(x) {
    x[, 6] = as.numeric(gsub("," , "", x[, 6], fixed = TRUE))
    return(x)
})
0 голосов
/ 20 сентября 2018

Часть ответа была получена отсюда: Цикл по списку фреймов данных в R

В вашем случае вы можете сделать следующее:

list_of_dfs = list(df1, df2, ..... , df25)
lapply(list_of_dfs, function(x) { x[, 6] <- as.integer(gsub("," , "", x[, 6])) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...