2017-05-01 2 views
2

捕獲されたアイテムの数を計算するために動作データを使用したいと考えています。これは私のデータ例です:列のカウント値は空のセルを使用して新しい番号を示します

df <- data.frame(id = as.factor(c(51,51,51,51,51,51,51,52,52,52,52,52,52)), 
      type = c("(K)","(K)","(K)","(K)","","","","(K)","(K)","","(K)","","(K)")) 

私の "K"は、連続しているかどうかに基づいてカウントしたいと思います。連続している場合、文字列は1とみなされます。間に隙間がある場合、それらは両方とも1としてカウントされるはずです。最終集計は2になります。

上記の例では、私は最終出力データをこのように見たいと思います

私は集計がこれを行うかもしれないと思った
id type tally 
1 51 (K)  1 
2 52 (K)  3 

が、しかし、それは任意の助けをいただければ幸い51タリーのために= 4ではなく1

ので、列に合計数をカウントし

おかげ グレース

答えて

3

ベースRのrleコマンドが便利です。

temp<- tapply(df$type, df$id, function(x) rle(x == "(K)")) 
df.new<- data.frame(id = names(temp), 
       tally = unlist(lapply(temp, function(x) sum(x$values)))) 
3

rleiddata.tableから試すことができます。 'data.frame'を 'id'でグループ化された 'data.table'(setDT(df))に変換し、 'type'のランレングスIDを 'id'でグループ化し、 'type'で見つけてlength空白

library(data.table) 
setDT(df)[, val := rleid(type), id][type!="", .(tally = uniqueN(val)), .(id, type)] 
# id type tally 
#1: 51 (K)  1 
#2: 52 (K)  3 

それとも私たちは、あなたがrleでそれを行うことができ、ベースRでtidyverse

library(tidyverse) 
df %>% 
    mutate(val = cumsum(type != lag(type, default = type[1]))) %>% 
    group_by(id) %>% 
    filter(type!="") %>% 
    summarise(type = first(type), tally= n_distinct(val)) 
# A tibble: 2 × 3 
#  id type tally 
# <fctr> <fctr> <int> 
#1  51 (K)  1 
#2  52 (K)  3 
+0

@ d.bビネットを通過しましたか?それは素晴らしいリソースです。それ以外の有料コースが必要な場合は、データキャンプも良いでしょう – akrun

+1

[ここ](https://github.com/Rdatatable/data.table/wiki/Getting-started)をチェックすることもできますそれがインストールされている 'data.table'パッケージ 'doc'フォルダにあります。 – akrun

+1

クール、ありがとうございます! –

4

を使用することができません 'ヴァル' のunique要素。最初にdfを分割してidとし、次に各サブグループの数を"(K)"とする。

sapply(split(df, df$id), function(a) 
    length(with(rle(as.character(a$type)), lengths[values == "(K)"]))) 
#51 52 
# 1 3 
関連する問題