2012-10-11 12 views
21

संभव डुप्लिकेट: एक सूत्र जहां कोई डुप्लिकेट देखते हैं बिना काम करता है
This R reshaping should be simple, butक्या कुल मिलाकर फ़ंक्शन के बिना उपयोग किया जा सकता है?

dcastreshape2 से। इन उदाहरण डेटा लें:

df <- structure(list(id = c("A", "B", "C", "A", "B", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 224L, 
225L, 2206L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-6L)) 

मैं डिफ़ॉल्ट length सहित value.var के लिए किसी भी समारोह लागू किए बिना, इन आंकड़ों dcast और बस मूल्यों सारणीबद्ध है चाहते हैं।

इस मामले में, यह ठीक काम करता है।

> dcast(df, id~cat, value.var="val") 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 2206 

लेकिन जब वहाँ डुप्लिकेट वैरिएबल, length को fun चूक रहे हैं। क्या इससे बचने का कोई तरीका है?

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

> dcast(df2, id~cat, value.var="val") 
Aggregation function missing: defaulting to length 
    id SS SV 
1 A 1 1 
2 B 1 1 
3 C 1 2 

मैं के लिए आदर्श रूप में क्या देख रहा हूँ एक fun = NA जोड़ने के लिए, के रूप में value.var एकत्र करने के लिए कोशिश नहीं करते। परिणाम मैं चाहता जब df2 dcasting:

id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4. C NA 1 
+0

क्या आप जब वहाँ दोहराव है यह करने के लिए चाहते हैं? – Dason

+0

बस किसी भी गायब मान के लिए 'NA' के साथ एक और पंक्ति के रूप में जोड़ें। – Maiasaura

+0

@Dason क्या यह अपने खुद के प्रश्न का उत्तर देने के लिए कोशेर है कि मैंने समाधान निकाला है? या मुझे बस क्यू हटा देना चाहिए? – Maiasaura

उत्तर

19

मुझे नहीं लगता कि इसमें सीधे करने के लिए एक रास्ता है, लेकिन हम एक अतिरिक्त स्तंभ में जोड़ सकते हैं जो हमें बाहर करने में मदद करेगा

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

library(reshape2) 
library(plyr) 
# Add a variable for how many times the id*cat combination has occured 
tmp <- ddply(df2, .(id, cat), transform, newid = paste(id, seq_along(cat))) 
# Aggregate using this newid and toss in the id so we don't lose it 
out <- dcast(tmp, id + newid ~ cat, value.var = "val") 
# Remove newid if we want 
out <- out[,-which(colnames(out) == "newid")] 
> out 
# id SS SV 
#1 A 220 224 
#2 B 222 225 
#3 C 223 220 
#4 C NA 1 
+0

धन्यवाद, मैं एक ही निष्कर्ष पर पहुंचा। – Maiasaura

9

मैंने उसी समाधान का पता लगाया जबकि डेसन मेरा जवाब दे रहा था।

मुझे एहसास हुआ कि dcast बस डुप्लीकेट से निपटने के बारे में नहीं जानता है। जिस तरह से मैंने यह पता लगाया कि यह कैसे एक और अद्वितीय पहचान जोड़ रहा है, इसलिए यह डुप्लिकेट द्वारा भ्रमित नहीं होता है।

इस उदाहरण में:

df <- ddply(df2, .(cat), function(x){ x$id2 = 1:nrow(x); x}) 
> dcast(df, id+id2~cat, value.var="val")[,-2] 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4 C NA 1 
+0

जो मेरे लिए इसी तरह के मामले के लिए बहुत उपयोगी था। धन्यवाद :) – sarah

+0

आपने मेरा दिन बचाया !! –

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