3

添付されているのはいくつかのRコードです。

temp_df <- data.frame(c("A","A","A","G","G","Z","Z"),
                    c("B","D","E","R","S","Y","U"),
                    c(1.5,1.1,0.8,0.2,0.8,0.9,0.1),
                    c(0.8,0.4,1.5,1.2,1.2,0.2,0.3),
                    c(2.7,2.7,2.7,2.4,2.4,0.5,0.5),
                    c("YES","NO","NO","NO","NO","YES","YES"))

colnames(temp_df) <- c("PERSON_1","PERSON_2","VALUE_1",
                     "VALUE_2","TOTAL_2","DECISION_2")

私がやろうとしているのは、次のルールに基づいて「NEW_DECISION_1」という名前の新しい列を作成することです。

列1( "PERSON_1")のユーザーの場合、列5( "TOTAL_2")の対応する値の値が2.0以上であり、列6の対応する値に少なくとも1つの"YES"がある場合("DECISION_2")の場合、"NEW_DECISION_1"列の値は"YES"になり、これらの基準が満たされない場合は、"NO"の値になります。

したがって、列1のAの人の場合、列5の値は2.7であり、列6の対応する値に少なくとも1つの「YES」があるため、新しい列の値は「YES」になります。

列1のGパーソンの場合、列5の値は2.4ですが、列6の対応する値に「YES」の値がないため、新しい列の値は「NO」になります。

列1のZ人物の場合、列5の値は1.0であり、列6の対応する値に少なくとも1つの「YES」があるため、新しい列の値は「NO」になります。したがって、新しいテーブルは次のようになります。

temp_df$NEW_DECISION_1 <- c("YES","YES","YES","NO","NO","NO","NO")
temp_df

ある種の集計ルールを考えていますが、「最小の「はい」」を検索するためにどの関数を使用すればよいかわかりません。

さらに詳しい情報や説明が必要な場合は、お知らせください。

4

2 に答える 2

4

これが解決策ddplyです:

library(plyr)
ddply(temp_df, .(PERSON_1), transform,
      NEW_DECISION_1 = c("NO", "YES")[(TOTAL_2 >= 2 &
                                       sum(DECISION_2 == "YES") > 0) + 1])

#   PERSON_1 PERSON_2 VALUE_1 VALUE_2 TOTAL_2 DECISION_2 NEW_DECISION_1
# 1        A        B     1.5     0.8     2.7        YES            YES
# 2        A        D     1.1     0.4     2.7         NO            YES
# 3        A        E     0.8     1.5     2.7         NO            YES
# 4        G        R     0.2     1.2     2.4         NO             NO
# 5        G        S     0.8     1.2     2.4         NO             NO
# 6        Z        Y     0.9     0.2     0.5        YES             NO
# 7        Z        U     0.1     0.3     0.5        YES             NO
于 2012-10-17T14:23:28.830 に答える
4

基本的なRソリューションは次のとおりです。

result <- by(temp_df, 
  INDICES=temp_df$PERSON_1, 
  FUN=function(x) 
    within(x, DECISION_1 <- ifelse(any(grepl('YES', DECISION_2)) & TOTAL_2 >= 2, 
                                   'YES', 'NO')))
do.call(rbind, result)

#        PERSON_1 PERSON_2 VALUE_1 VALUE_2 TOTAL_2 DECISION_2 DECISION_1
#    A.1        A        B     1.5     0.8     2.7        YES        YES
#    A.2        A        D     1.1     0.4     2.7         NO        YES
#    A.3        A        E     0.8     1.5     2.7         NO        YES
#    G.4        G        R     0.2     1.2     2.4         NO         NO
#    G.5        G        S     0.8     1.2     2.4         NO         NO
#    Z.6        Z        Y     0.9     0.2     0.5        YES         NO
#    Z.7        Z        U     0.1     0.3     0.5        YES         NO
于 2012-10-17T14:23:32.933 に答える