2015-01-14 6 views
5
होना चाहिए

एक dataframe कल्पना कीजिए:subsetting, लेकिन मूल्य स्तंभ नाम

set.seed(1234) 
data<-data.frame(id = sample(letters, 26, replace = FALSE), 
         a = sample(1:10,26,replace=T), 
         b = sample(1:10,26,replace=T), 
         c = sample(1:10,26,replace=T)) 

मैं बनाए रखने के लिए, प्रत्येक id के लिए, स्तंभ नाम है, जिसमें सबसे बड़ा मान झूठ चाहते हैं।

परिणाम जो मैं देख रहा हूं वह डेटा फ्रेम है जिसमें 0 xके लिए कॉलम के साथ 26 x 2 के आयाम और largest_value_var के लिए कॉलम है। largest_value_var में a, b, या c शामिल होंगे।

अब तक, मैं चर नाम है जिसके साथ अधिकतम मूल्य इस का उपयोग कर जुड़ा हुआ है निकालने के लिए सक्षम किया गया है:

apply(data[,-1], 1, function(x) c(names(x))[which.max(x)]) 

लेकिन मैं काफी परिणाम मैं एक में करना चाहते हैं पाने के लिए नहीं कर पा रहे डेटाफ्रेम ... किसी भी मदद की सराहना की है।

उत्तर

7

आप max.col() के साथ यह काफी आसानी से कर सकते हैं। ties.method = "first" (धन्यवाद अकरुन) सेट करना, हमें टाई के मामले में पहला कॉलम मिलेगा।

library(data.table) 
setDT(data)[, names(.SD)[max.col(.SD, "first")], by = id] 

अपडेट:: यहाँ एक डेटा तालिका विधि है ऐसा लगता है जब शायद max.col() में as.matrix() रूपांतरण की वजह से आधार आर में लागू, इस विधि अधिक कुशल हो जाएगा। तो आधार पर इसे पूरा करने का एक तरीका यहां है।

cbind(data[1], largest = names(data)[-1][max.col(data[-1], "first")]) 

दक्षता अंतर को इंगित करने के लिए आनंद महतो को धन्यवाद।

4

मैं @max.col के रिचर्ड उपयोग पसंद है, लेकिन पहली बात यह है कि मेरे दिमाग में आया था जिसके बाद subsetting आप आसान होना चाहिए चाहते हैं कर वास्तव में पहली बार एक "साफ" फ़ॉर्म में डेटा प्राप्त करने के लिए किया गया था,:

library(reshape2) 
library(data.table) 
melt(as.data.table(data), id.vars = "id")[, variable[which.max(value)], by = id] 
#  id V1 
# 1: c b 
# 2: p a 
# 3: o c 
# 4: x b 
# 5: s a 
## SNIP ### 
# 21: g a 
# 22: f b 
# 23: t a 
# 24: y a 
# 25: w b 
# 26: v a 
#  id V1 
+0

मैं अपनी टिप्पणी समाधान इस एक से बेहतर पसंद आया। रुको ... आपने इसे हटा दिया? –

+1

@BondedDust, नहीं। मैं इसे रिचर्ड को प्रदान किया, क्योंकि वह मेरे सामने 'max.col' के बारे में सोचा। ओह, और अपने अन्य टिप्पणी के लिए धन्यवाद आज :-) – A5C1D2H2I1M1N2O1R2T1

3

आदेश एक डेटा फ्रेम में अपने apply() कॉल से परिणाम डाल करने के लिए, तुम कर सकते हो

df <- data.frame(id=data$id, 
      largest_value_var=apply(data[,-1], 1, function(x) names(x)[which.max(x)])) 

ध्यान दें कि c(names(x))names(x) रूप में ही है, तो मैं c() छोड़े गए।

+0

@RichardScriven, वहाँ वास्तव में कोई समूह इस मामले में आवश्यक है। – A5C1D2H2I1M1N2O1R2T1

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