2012-09-28 20 views
5

में एक data.frame टर्निंग मैं इन आंकड़ों है:एक ही पंक्ति

structure(list(type = c("journal", "all", "similar_age_1m", "similar_age_3m", 
"similar_age_journal_1m", "similar_age_journal_3m"), count = c("13972", 
"754555", "22408", "56213", "508", "1035"), rank = c("13759", 
"754043", "22339", "56074", "459", "947"), pct = c("98.48", "99.93", 
"99.69", "99.75", "90.35", "91.50")), .Names = c("type", "count", 
"rank", "pct"), row.names = c(NA, -6L), class = "data.frame") 

मैं, एक ही पंक्ति में इसे चालू करने के कॉलम 2:4 इसी प्रकार लगाया जाता है के नाम के साथ करना चाहते हैं। जैसे journal.count, journal.rank ... ऐसा करने का सबसे तेज़ तरीका क्या है? किसी कारण से dcast और reshape मेरे लिए यह नहीं कर रहे हैं और मेरा समाधान थोड़ा बोझिल है।

+0

मुझे समझ में नहीं आता कि "गिनती" और "रैंक" – GSee

+0

से आती है, मैंने इसे ठीक किया और सवाल अपडेट किया। – Maiasaura

उत्तर

5

आप reshape2 उल्लेख किया है, इसलिए यहाँ उस के साथ एक तरीका है:

library("reshape2") 
dcast(melt(dat, id.var="type"), 1~variable+type) 

देता है कि:

1 count_all count_journal count_similar_age_1m count_similar_age_3m 
1 1 754555   13972    22408    56213 
    count_similar_age_journal_1m count_similar_age_journal_3m rank_all 
1       508       1035 754043 
    rank_journal rank_similar_age_1m rank_similar_age_3m 
1  13759    22339    56074 
    rank_similar_age_journal_1m rank_similar_age_journal_3m pct_all pct_journal 
1       459       947 99.93  98.48 
    pct_similar_age_1m pct_similar_age_3m pct_similar_age_journal_1m 
1    99.69    99.75      90.35 
    pct_similar_age_journal_3m 
1      91.50 

type और v . के बजाय, _ के साथ अक्षरों को अलग किया गया है।

+0

+1 मुझे इसे मारो। – joran

+0

बहुत बढ़िया! आपने मेरे लिए पुरानी समस्या हल कर ली है, जहां मैं कभी भी मूल रूप में डेटा को अनमेट नहीं कर सकता क्योंकि सूत्र हमेशा तीसरे चर की तलाश करते हैं। – Maiasaura

+0

यह अनुरोध से अलग नाम भी देता है, लेकिन OP को 'dcast' फिक्स – GSee

0

अपने डेटा फ्रेम को मानते हुए यहां एक समाधान कहा जाता है। इसमें कुछ समय कच्चे तेल की है और नहीं हो सकता है क्या आप के बाद कर रहे हैं:

dat2 <- data.frame(matrix(unlist(lapply(1:nrow(dat), function(i) dat[i, -1])), nrow=1)) 
colnames(dat2) <- paste0(rep(dat[, 1], each=ncol(dat)-1), ".", 1:(ncol(dat)-1)) 
dat2 

यह एक डेटा फ्रेम होने के लिए नहीं है, तो यह भी काम कर सकता था:

dat3 <- as.numeric(unlist(lapply(1:nrow(dat), function(i) dat[i, -1]))) 
names(dat3) <- paste0(rep(dat[, 1], each=ncol(dat)-1), ".", 1:(ncol(dat)-1)) 
dat3 
1

यहाँ एक समाधान expand.grid का उपयोग कर नाम पाने के लिए।

डेटा प्राप्त करने के लिए, पहले, नाम वाले पहले कॉलम को हटाने के लिए सबसेट करें। फिर, स्थानांतरित करें और संख्यात्मक रूपांतरित करें।

> eg <- expand.grid(colnames(x[, -1]), x[, 1]) 
> setNames(as.numeric(t(x[, -1])), paste(eg[[2]], eg[[1]], sep=".")) 
       journal.count     journal.rank 
        13972.00      13759.00 
       journal.pct     all.count 
         98.48     754555.00 
        all.rank      all.pct 
        754043.00      99.93 
     similar_age_1m.count   similar_age_1m.rank 
        22408.00      22339.00 
      similar_age_1m.pct   similar_age_3m.count 
         99.69      56213.00 
     similar_age_3m.rank   similar_age_3m.pct 
        56074.00      99.75 
similar_age_journal_1m.count similar_age_journal_1m.rank 
         508.00      459.00 
    similar_age_journal_1m.pct similar_age_journal_3m.count 
         90.35      1035.00 
similar_age_journal_3m.rank similar_age_journal_3m.pct 
         947.00      91.50 
+0

ओह। मुझे एहसास नहीं हुआ कि आप 'data.frame' – GSee

2

यहाँ एक और तरीका है:

y <- as.numeric(as.matrix(x[-1])) # flatten the data.frame 
names(y) <- as.vector(outer(x[['type']], names(x)[-1], paste, sep='.')) 
+0

काम करना चाहते हैं जब मैं' t (data.frame (y)) जोड़ता हूं। सुरुचिपूर्ण जवाब। – Maiasaura

+0

यह काम करता है यदि ओपी परवाह नहीं है यदि परिणाम प्रश्न में दिखाए गए अनुसार एक ही क्रम में हैं। – GSee

1
#assuming your data is called "test" 
result <- as.data.frame(matrix(t(test[-1]),nrow=1),stringsAsFactors=FALSE) 
names(result) <- as.vector(t(outer(unique(test$type),names(test[-1]),paste,sep="."))) 

str(result) 
'data.frame': 1 obs. of 18 variables: 
$ journal.count    : chr "13972" 
$ journal.rank    : chr "13759" 
$ journal.pct     : chr "98.48" 
$ all.count     : chr "754555" 
$ all.rank     : chr "754043" 
$ all.pct      : chr "99.93" 
$ similar_age_1m.count  : chr "22408" 
$ similar_age_1m.rank   : chr "22339" 
$ similar_age_1m.pct   : chr "99.69" 
$ similar_age_3m.count  : chr "56213" 
$ similar_age_3m.rank   : chr "56074" 
$ similar_age_3m.pct   : chr "99.75" 
$ similar_age_journal_1m.count: chr "508" 
$ similar_age_journal_1m.rank : chr "459" 
$ similar_age_journal_1m.pct : chr "90.35" 
$ similar_age_journal_3m.count: chr "1035" 
$ similar_age_journal_3m.rank : chr "947" 
$ similar_age_journal_3m.pct : chr "91.50" 
+0

अच्छा, लेकिन नाम पीछे की ओर मिला। – GSee

+1

जोप्स ... इसे अभी तय करें – thelatemail

2

मान लें कि आप एक डमी "समय" चर पुन: आकार देने के लिए जोड़ने के साथ ठीक कर रहे हैं, तो आप इस आसानी से आधार आर के साथ भी कर सकते हैं। मान लिया जाये कि अपने data.frame कहा जाता है:

mydf$id <- 1 
(mydfw <- reshape(mydf, direction = "wide", idvar="id", timevar="type")) 
# id count.journal rank.journal pct.journal count.all rank.all pct.all 
# 1 1   13972  13759  98.48 754555 754043 99.93 
# count.similar_age_1m rank.similar_age_1m pct.similar_age_1m 
# 1    22408    22339    99.69 
# count.similar_age_3m rank.similar_age_3m pct.similar_age_3m 
# 1    56213    56074    99.75 
# count.similar_age_journal_1m rank.similar_age_journal_1m 
# 1       508       459 
# pct.similar_age_journal_1m count.similar_age_journal_3m 
# 1      90.35       1035 
# rank.similar_age_journal_3m pct.similar_age_journal_3m 
# 1       947      91.50 

सफाई बहुत बुरा या तो नहीं है, अगर आप अपने कॉलम को पुन: व्यवस्थित करना चाहते हैं।

mydfw <- mydfw[, unlist(sapply(names(mydf), grep, names(mydfw)))] 
संबंधित मुद्दे