2017-03-28 5 views
0

列bの数値を含む行のみを合計する方法。R特定の列の数値のみを含むdata.frameの行の合計

a <- c(1,5,3,1,-8,6,-1) 
b <- c(4,-2,1,0,"c",2,"DX") 

df <- data.frame(a,b) 
df 

# a b 
# 1 1 4 
# 2 5 -2 
# 3 3 1 
# 4 1 0 
# 5 -8 c 
# 6 6 2 
# 7 -1 DX 

私は、列bの数値行だけをどのように合計するかわかりません。私は自分の名前を入力して、それらを読むことができます

path <- "C:/Users/Visitor/Desktop/Unesco/" 
files <- list.files(path=path, pattern="*.csv") 
for(file in files) 
{ 
perpos <- which(strsplit(file, "")[[1]]==".") 
assign(
gsub(" ","",substr(file, 1, perpos-1)), 
read.csv(paste(path,file,sep=""))) 
} 

(CSVファイル:実際には

私はこのコードを使用してデータフレームの形でRで倍数のcsv私が読んで、ファイルやストアからある複数のデータを持っています)

問題は、いくつかの列に数値と文字の両方が含まれているため、単純な和を計算できないということです。

+0

実際には私のデータフレームは、同じ列名を持つ多くの他のデータフレームのリストにあります。リストのdfですか? – PiecesOfMagics

+0

dbは動作しません。エラーが発生するNAsはソートで強制的に導入されました。 – PiecesOfMagics

答えて

2

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_atsummarise_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))) 
} 
+0

Thx非常に多くの場合、私のすべてのデータフレームが同じ名前ではないのですか? – PiecesOfMagics

+0

@JulienNguyenこれは問題ではありません。この方法では、各 'data.frame'に異なる列名を付けることができます。リストの各要素は、' data.frame'の各列を常に合計していれば、別の名前を持つことができます。私はそれを反映するために私の答えを少し編集しました。 –

+0

"Fichier1"と "Fichier2"と呼ばれる2つのデータフレームがある場合、関数のdfの代わりに何を書いていますか? – PiecesOfMagics

0

あなたは、行で合計する探している場合:列によってたい場合

rowSums(df[!is.na(df$b),]) 

:唯一の非NAのため

a <- c(1,5,3,1,-8,6,-1) 
b <- c(4,-2,1,0,"c",2,"DX") 

df <- data.frame(a,b = as.numeric(b)) 
rowSums(df) 

colSums(df[!is.na(df$b),]) 

かに応じて列で合計したいもの:

colSums(df, na.rm = TRUE) 
+0

上記のコメントから、最後の行のコード 'colSums(df、na.rm = TRUE)' – student

+0

からの出力を探していると思います。私の場合は、複数のCSVファイルを多くのデータフレームに読み込むループを行うので、df.Butを作成する必要があるので、私はあなたのメソッドを実行できません。 – PiecesOfMagics

関連する問題