2

2つの列を持つ単純なデータフレームがあります。

df <- data.frame(x = c(1,1,2,2,3), 
                 y = c(rep(1:2,2),1), 
                 target = c('a','a','a','b','a'))

xのすべてのレベル(xの同じ数)内で、ターゲット列の文字列を比較します(それらが等しいかどうか、つまり、TRUEまたはFALSEを調べます)。最初に1行目と2行目、次に3行目と4行目を比較したいと思います...私の問題は、いくつかの比較が欠落していることです。たとえば、5行目は2つではなく1つのケースしかないため、FALSEになるはずです。変数yは、x内の最初と2番目のケースを示します。

私はddplyで次のようなことをして遊んだ。

ddply(df, .(x), summarise,
        ifelse(as.character(df[df$y == '1',]$target), 
               as.character(df[df$y == '2',]$target),0,1))

これは醜いです...そして動作しません...

この比較をどのように達成できるかについての洞察はありますか?

ありがとう

4

3 に答える 3

1

これがベースRソリューションです。あなたが望んでいたことを正しく実行したと仮定します。foo()は、各サブセットの2つの値を比較する関数ですがtarget、各サブセットsplit()のデータdf$xを比較しますl|sapply() foo()

foo <- function(x) {
    with(x, {if(length(target) < 2) {
                 FALSE
             } else {
                 isTRUE(all.equal(target[1], target[2]))
             }})
}
lapply(split(df, df$x), foo)

sapply(split(df, df$x), foo)

この出力を生成する

> lapply(split(df, df$x), foo)
$`1`
[1] TRUE

$`2`
[1] FALSE

$`3`
[1] FALSE

> 
> sapply(split(df, df$x), foo)
    1     2     3 
 TRUE FALSE FALSE
于 2012-09-04T21:37:11.000 に答える
1
ddply(df, .(x), function(d) NROW(d) == 2 & d$target[1] == d$target[2])

これは、その「x」値を持つ行が正確に2つある場合にのみ、値をTRUEにすることを前提としています。3つ以上ある可能性があり、すべての値が同一である場合にそれをTRUEにしたい場合targetは、次のようにすることができます。

ddply(df, .(x), function(d) NROW(d) > 1 & length(unique(d$target)) == 1)
于 2012-09-04T21:31:29.877 に答える
1
 ave(as.character(df$target), df$x, 
     FUN=function(z) if ( length(z)=="2" & length(unique(z))==1){TRUE} else{ FALSE })
[1] "TRUE"  "TRUE"  "FALSE" "FALSE" "FALSE"

または...グループごとの結果のみが必要な場合は....、集計を使用します。

>  aggregate(as.character(df$target), list(df$x), 
+      FUN=function(z) if ( length(z)=="2" & length(unique(z))==1){TRUE} else{ FALSE })
  Group.1     x
1       1  TRUE
2       2 FALSE
3       3 FALSE
于 2012-09-04T22:42:16.647 に答える