2011-08-26 37 views
5

Giả sử tôi muốn tạo một khung dữ liệu lớn từ đầu.Tạo các Khung Dữ liệu Lớn

Sử dụng chức năng data.frame là cách tôi thường tạo khung dữ liệu. Tuy nhiên, df của như sau là cực kỳ dễ bị lỗi và không hiệu quả.

Vì vậy, có cách hiệu quả hơn để tạo khung dữ liệu sau.

df <- data.frame(GOOGLE_CAMPAIGN=c(rep("Google - Medicare - US", 928), rep("MedicareBranded", 2983), 
            rep("Medigap", 805), rep("Medigap Branded", 1914), 
            rep("Medicare Typos", 1353), rep("Medigap Typos", 635), 
            rep("Phone - MedicareGeneral", 585), 
            rep("Phone - MedicareBranded", 2967), 
            rep("Phone-Medigap", 812), 
            rep("Auto Broad Match", 27), 
            rep("Auto Exact Match", 80), 
            rep("Auto Exact Match", 875)),     
       GOOGLE_AD_GROUP=c(rep("Medicare", 928), rep("MedicareBranded", 2983), 
            rep("Medigap", 805), rep("Medigap Branded", 1914), 
            rep("Medicare Typos", 1353), rep("Medigap Typos", 635), 
            rep("Phone ads 1-Medicare Terms",585), 
            rep("Ad Group #1", 2967), rep("Medigap-phone", 812), 
            rep("Auto Insurance", 27), 
            rep("Auto General", 80), 
            rep("Auto Brand", 875))) 

Yikes, đó là một số mã 'xấu'. Làm thế nào tôi có thể tạo khung dữ liệu 'lớn' này một cách hiệu quả hơn?

+0

Tôi sắp xếp thận trọng tại sao bạn có quá nhiều dữ liệu lặp lại trong cả hai cột. Thông thường khi tôi đã lặp lại dữ liệu trong một cột, nó thay đổi hoặc quay vòng trong cột kia (suy nghĩ đếm trong nhị phân). – Owen

Trả lời

7

Nếu nguồn duy nhất của bạn để biết thông tin đó là một mảnh giấy, sau đó có thể bạn sẽ không nhận được nhiều tốt hơn, nhưng bạn ít nhất có thể củng cố tất cả những gì thành một rep cuộc gọi duy nhất cho mỗi cột:

#I'm going to cheat and not type out all those strings by hand 
x <- unique(df[,1]) 
y <- unique(df[,2]) 

#Vectors of the number of times for each  
x1 <- c(928,2983,805,1914,1353,635,585,2967,812,27,955) 
y1 <- c(x1[-11],80,875) 

dd <- data.frame(GOOGLE_CAMPAIGN = rep(x, times = x1), 
       GOOGLE_AD_GROUP = rep(y, times = y1)) 

mà nên là như nhau:

> all.equal(dd,df) 
[1] TRUE 

Nhưng nếu thông tin này đã nằm trong một cấu trúc dữ liệu trong R bằng cách nào đó và bạn chỉ cần transform, điều đó có thể dễ dàng hơn, nhưng chúng ta cần phải biết cấu trúc đó là gì.

+0

damn .. đánh bại tôi một lần nữa ... – John

+0

@John Xin lỗi. Tôi đã mất số lượng câu trả lời tôi đã bỏ đi vì ai đó đánh tôi với nó, nếu điều đó làm cho bạn cảm thấy tốt hơn. – joran

+0

nó không ... bạn có thể gửi cho tôi một triệu đô la ... điều đó sẽ giúp – John

3

thủ, (1) tạo khung dữ liệu này:

> dfu <- unique(df) 
> rownames(dfu) <- NULL 
> dfu 
      GOOGLE_CAMPAIGN   GOOGLE_AD_GROUP 
1 Google - Medicare - US     Medicare 
2   MedicareBranded   MedicareBranded 
3     Medigap     Medigap 
4   Medigap Branded   Medigap Branded 
5   Medicare Typos    Medicare Typos 
6   Medigap Typos    Medigap Typos 
7 Phone - MedicareGeneral Phone ads 1-Medicare Terms 
8 Phone - MedicareBranded    Ad Group #1 
9   Phone-Medigap    Medigap-phone 
10  Auto Broad Match    Auto Insurance 
11  Auto Exact Match    Auto General 
12  Auto Exact Match     Auto Brand 

và (2) vector này có độ dài:

> lens <- rle(as.numeric(interaction(df[[1]], df[[2]])))$lengths 
> lens 
[1] 928 2983 805 1914 1353 635 585 2967 812 27 80 875 

Từ hai đầu vào này (dfulens) chúng ta có thể tái tạo lại df (ở đây được gọi là df2):

> df2 <- dfu[rep(seq_along(lens), lens), ] 
> rownames(df2) <- NULL 
> identical(df, df2) 
[1] TRUE 
Các vấn đề liên quan