2017-12-02 5 views
2

私はこれと少し似て探していたデータを持っている:複数の値

number type results 
1   5  x, y, z 
2   6  a 
3   8  x 
1   5  x, y 

は基本的に、私は、個々の細胞のカップルにカンマを持つExcelでデータを持っていると私は分離された各値をカウントする必要があります特定の要件がサブセッティングによって満たされた後、カンマで区切ります。

質問:数字== 1、タイプ== 5のデータをRでサブセット化すると、5の合計を受け取るにはどうすればよいですか?

+0

でしょうか? rのサンプルデータセットを提供できますか? –

答えて

1

dplyrtidyrを使用するオプションです。 filter関数は、条件に基づいて行をフィルタリングできます。 separate_rowsはコンマを区切ることができます。 group_byは、データをグループ化することです。 tallyは数字を数えることができます。

dt2 <- dt %>% 
    filter(number == 1, type == 5) %>% 
    separate_rows(results) %>% 
    group_by(results) %>% 
    tally() 
# # A tibble: 3 x 2 
# results  n 
#  <chr> <int> 
# 1  x  2 
# 2  y  2 
# 3  z  1 

また、count(results)は、次のコードで示すように使用できます。ここで

dt2 <- dt %>% 
    filter(number == 1, type == 5) %>% 
    separate_rows(results) %>% 
    count(results) 

DATA

dt <- read.table(text = "number type results 
1   5  'x, y, z' 
       2   6  a 
       3   8  x 
       1   5  'x, y'", 
       header = TRUE, stringsAsFactors = FALSE) 
+0

'separate_rows(results)'の後、 'count(results)'だけで終わることができます。 – jazzurro

+0

@jazzurroご意見ありがとうございます。答えをより包括的にするために私のコードにあなたの提案を加えました。 – www

+1

お手伝いをしてください。 :) – jazzurro

1

はその後numberによってグループ化をこれらを合計し、あなたはカンマでresultsを分割ベースR.を用いた方法であり、各リストの長さを取得します。

aggregate(sapply(strsplit(df$results, ","), length), list(df$number), sum) 
    Group.1 x 
1  1 5 
2  2 1 
3  3 1 

あなたのデータ:

df = read.table(text="number type results 
1   5  'x, y, z' 
2   6  'a' 
3   8  'x' 
1   5  'x, y'", 
header=TRUE, stringsAsFactors=FALSE) 
1

我々は合計カウントが必要な場合は、その後、別のオプションがbase R

から

library(stringr) 
with(df, sum(str_count(results[number==1 & type==5], "[a-z]"), na.rm = TRUE)) 
#[1] 5 

またはgregexprとをサブセット化した後str_countです210

with(df, sum(lengths(gregexpr("[a-z]", results[number==1 & type==5])), na.rm = TRUE)) 
#[1] 5 

要素に該当するパターンが存在しない場合、どのようにRで、このデータを格納している

with(df, sum(unlist(lapply(gregexpr("[a-z]", 
     results[number==1 & type==5]), `>`, 0)), na.rm = TRUE)) 
+1

またはstringiパッケージ内のstri_count()がそうすると思います。 – jazzurro

+1

@ジャズロロはい、それもやります。ありがとう – akrun