R'de veri çerçevesi nasıl genişletilir


15

R ile bazı analizler yaparken sorun yaşıyorum.

Ben böyle bir veri çerçevesi var:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

ve ben "doğru" (doğru terim olup olmadığını emin değilim) böyle olması gerekir:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

vb.

Bu yüzden Kişi 1 ve A çiftinin değerini alır (bu örnekte 3) ve Kişi 1 ve A ile üç satır yapar ve bunu her Kişi - Grup birleşimi için yapar. Çevrimiçi arama yapmak için iyi kelimeler bulamıyorum.



reshape2Paketi R'de keşfetmelisiniz. dputBiri girişli diğeri çıkışlı olmak üzere 2 örnek veri çerçevesine de yardımcı olabilir .
Zach

Bir cevap verdim ama bu bir R programlama sorusunun istatistiksel bir sorudan daha fazla olduğunu tahmin ediyorum, bu yüzden belki başka bir yere taşınmalıdır.
Gala

Cevabım için sorum ve biçimlendirmeye yardımcı olduğun için teşekkürler Gaël.
Juha-Matti

Yanıtlar:


10

Çok kullanışlı bir paket olsa da, bu durumda yeniden şekillendirmenin aşırıya kaçması olduğunu düşünüyorum , rep işi yapabilir.

Aşağıda bazı örnek veriler verilmiştir:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Şimdi, "genişletmek" için:

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

Doğrudan kafamın üstündeki veri çerçevesi üzerinde çalışmanın bir yolunu bulamadım, bu yüzden her bir değişken üzerinde ayrı ayrı çalışıyorum ve sonra onları yeniden birleştiriyorum, bu biraz çirkin ama her zaman kullandığınız sürece iyi olmalı sayımlar için aynı değişken.


7
Buna ne dersin df[rep(seq_len(nrow(df)), df$count), 1:2]?
chl

@chl, efendim mükemmelsiniz!
Chris

15

Yeniden şekillendirme paketindeki kararsız işlevi kullanabilirsiniz.

Yukarıdaki df verildi (@ Gaël Laurans tarafından)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untableYorumumda tam olarak bahsettiğim şeyi yapıyor :-) Bu fonksiyonu hatırlattığınız için teşekkürler!
chl

1

Ve uncountgelen tidyrşimdi yukarıdaki aynı sonucu verir.

library(tidyr)
df %>% uncount(Count)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.