data.frame
を作成したり、ファクタを既存のdata.frame
の文字に変換するときは、stringsAsFactors = FALSE
を使用することをおすすめします。次に、新しい列に数値を抽出することができます。この列は、定期的なtidyverseツールで合計できます。
library(tidyverse)
a <- c(1,5,3,1,-8,6,-1)
b <- c(4,-2,1,0,"c",2,"DX")
df <- data.frame(a, b, stringsAsFactors = F)
df %>%
mutate(b_numbers = parse_double(b)) %>%
summarise(sum = sum(b_numbers, na.rm = T))
#> Warning: 2 parsing failures.
#> row col expected actual
#> 5 -- a double c
#> 7 -- a double DX
#> sum
#> 1 5
このアプローチは、複数の列での作業にうまく一般化:
df %>%
mutate_all(funs(parse_double)) %>%
summarise_all(funs(sum(., na.rm = T)))
#> Warning: 2 parsing failures.
#> row col expected actual
#> 5 -- a double c
#> 7 -- a double DX
#> a b
#> 1 7 5
あなたはこのような多くのdata.frame
秒を持っている場合は、機能にそれを回すことができるし、あなたのリストにマップしてください:
my_fun <- function(x) {
x %>%
mutate_all(funs(suppressWarnings(parse_double(.)))) %>%
summarise_all(funs(sum(., na.rm = T)))
}
# create list with multiple data.frames
my_list <- list(a = df, b = df)
my_list %>%
map(my_fun)
#> $a
#> a b
#> 1 7 5
#>
#> $b
#> a b
#> 1 7 5
のように、suppressWarnings()
を使用して、parse_double
から警告を消音することができます。この例ではparse_double
よりもas.numeric
を好むでしょう。何が起こっているのかについての情報があるからです。
編集: あなたdata.frame
秒の列は常に同じ名前を持っていることを、元の質問にあなたのコメントに記載されているので、あなたがmutate_at
とsummarise_at
を使用することができます。
my_fun <- function(x) {
x %>%
mutate_at("b", funs(suppressWarnings(parse_double(.)))) %>%
summarise_at("b", funs(sum(., na.rm = T)))
}
または複数について列:
my_fun <- function(x) {
x %>%
mutate_at(c("a", "b"), funs(suppressWarnings(parse_double(.)))) %>%
summarise_at(c("a", "b"), funs(sum(., na.rm = T)))
}
実際には私のデータフレームは、同じ列名を持つ多くの他のデータフレームのリストにあります。リストのdfですか? – PiecesOfMagics
dbは動作しません。エラーが発生するNAsはソートで強制的に導入されました。 – PiecesOfMagics