2015-12-24 2 views
6

मैं सोच रहा था कि किसी को यह हासिल करने का अच्छा तरीका है या नहीं।डुप्लीकेट बनाने के बिना आर में लुकअप टेबल का उपयोग कैसे करें?

# Create sample data. 
item  = rep(1:3,2)        #6 items 
condition = c(rep("control",3), rep("related",3)) #2 conditions 
value  = c(10,11,12,20,21,22)      #6 values   
df   = data.frame(item, condition, value) 

    item condition value 
1 1 control 10 
2 2 control 11 
3 3 control 12 
4 1 related 20 
5 2 related 21 
6 3 related 22 

मैं भी एक लुक-अप तालिका, जो प्रत्येक समूह के मतलब शामिल है: मैं एक डेटा फ्रेम जहां प्रत्येक अवलोकन (= आइटम), एक विशेष समूह (= हालत) से संबंधित किसी दिए गए महत्व है है :

# Create lookup table. 
condition = c("control", "related") 
mean  = c(11,21) 
table  = data.frame(condition, mean) 

    condition mean 
1 control 11 
2 related 21 

मैं अपने मूल डेटा फ्रेम संशोधित करना चाहते हैं, इस तरह के हैं कि यह एक नया स्तंभ, label, जो कहते हैं में शामिल है "कम" यदि आइटम के मूल्य की तुलना में कम समूह मतलब है, और "उच्च "अन्यथा। यह इस तरह दिखना चाहिए:

# How the output should look like. 
# If the item value is less than the group mean, write "low". Write "high" otherwise. 
item  = rep(1:3,2)        
condition = c(rep("control",3), rep("related",3))  
value  = c(10,11,12,20,21,22)      
label  = c(rep(c("low", "high", "high"),2)) 
output  = data.frame(item, condition, value, label) 

    item condition value label 
1 1 control 10 low 
2 2 control 11 high 
3 3 control 12 high 
4 1 related 20 low 
5 2 related 21 high 
6 3 related 22 high 

यदि यह सिर्फ समूह अपने मूल डेटा फ्रेम का मतलब कॉपी करने की बात कर रहे थे, मैं merge का प्रयोग करेंगे। लेकिन मुझे समूह की औसत के आधार पर "कम" या "उच्च" कहने के लिए समूह को एक नया लेबल लिखने के लिए समूह को ध्यान में रखना है।

एक बात है कि मैं करने की कोशिश की पहली तालिका के साथ अपने डेटा फ्रेम मर्ज करने के लिए, और फिर ifelse का उपयोग साथ मूल्य स्तंभ तुलना करने के लिए स्तंभ मतलब था। यह काम करता है, लेकिन मैं अपने डेटा फ्रेम में माध्य कॉलम के साथ भी समाप्त होता हूं, जिसकी मुझे आवश्यकता नहीं है (मुझे केवल लेबल कॉलम की आवश्यकता है)। बेशक, मैं हाथ से मतलब कॉलम हटा सकता हूं, लेकिन यह गुंजाइश लगता है। तो मैं सोच रहा था: क्या कोई बेहतर/अधिक सुरुचिपूर्ण समाधान जानता है?

धन्यवाद एक गुच्छा!

+0

यदि समूह मतलब dplyr, 11 है चाहिए विवाद एल की स्थिति 11 "उच्च" हो? संबंधों के बारे में क्या? – Minnow

+0

यदि मान समूह के बराबर या उससे अधिक है, तो लेबल को "उच्च" होना चाहिए। लेकिन अगर आप कुछ अलग करना चाहते हैं, तो आप "<" "<=" के साथ बदल सकते हैं। – Sol

उत्तर

11

यहां कुछ विकल्प दिए गए हैं। (1) और (2) केवल बेस आर और (2), (3) और (5) का उपयोग केवल स्पष्ट रूप से हटाए जाने के लिए एक औसत कॉलम नहीं बनाते हैं। (1), (3) और (4) हमने बाएं जुड़ने का उपयोग किया, हालांकि आंतरिक जोड़ों ने इस डेटा के साथ एक ही परिणाम दिया होगा और (1 ए) के मामले में हमें एक पंक्ति के रूप में (1) लिखने की अनुमति मिलती है।

1) विलय

m <- merge(df, table, all.x = TRUE) 
transform(m, label = ifelse(value < mean, "low", "high"), mean = NULL) 

दे रही है:

transform(merge(df, table), label = ifelse(value < mean, "low", "high"), mean = NULL) 

2) मैच:

item condition value label 
1 1 control 10 low 
2 2 control 11 high 
3 3 control 12 high 
4 1 related 20 low 
5 2 related 21 high 
6 3 related 22 high 

1 क) एक आंतरिक के साथ शामिल होने के लिए यह छोटा किया जा सकता है

transform(df, 
    label = ifelse(value < table$mean[match(condition, table$condition)], "low", "high") 
) 

वही देना।

3) sqldf

library(sqldf) 
sqldf("select 
     df.*, 
     case when value < mean 
       then 'low' 
       else 'high' 
       end label 
     from df 
     left join 'table' using (condition)") 

4)

library(dplyr) 
df %>% 
    left_join(table) %>% 
    mutate(label = ifelse(value < mean, "low", "high")) %>% 
    select(- mean) 

5) data.table

library(data.table) 
dt <- as.data.table(df) 
setkey(dt, "condition") 
dt[table, label := ifelse(value < mean, "low", "high")] 
+1

वाह, यह वास्तव में पूरी तरह से है, धन्यवाद! और ये समाधान मैं जो कर रहा था उससे बेहतर तरीका: मुझे खुशी है मैंने पूछा! समाधान 2 में एक टाइपो है ("कम" में एक उद्धरण गायब है, लेकिन मैं इसे ठीक नहीं कर सकता क्योंकि संपादन 6 वर्णों से कम है। – Sol

+0

निर्धारित टाइपो है। –

संबंधित मुद्दे