2016-12-06 97 views
0

我需要爲現有數據框創建一個考慮因素水平的新列。我有2個數據框叫做dat_group和dat_prices。這些數據框如下所示。考慮到一個數據幀的因子水平和另一個數據幀的列名使用r

dat_group

  Group 
1  A 
2  A 
3  A 
4  A 
5  A 
6  A 
7  A 
8  A 
9  A 
10  A 
11  C 
12  C 
13  C 
14  C 
15  C 
16  C 
17  C 
18  C 
19  C 
20  C 
21  B 
22  B 
23  B 
24  B 
25  B 
26  B 
27  B 
28  B 
29  B 
30  B 

dat_price

A B C 
1 21 45 24 
2 21 45 24 
3 21 45 24 
4 21 45 24 
5 15 11 10 
6 15 11 10 
7 15 11 10 
8 20 13 55 
9 20 13 55 
10 20 13 55 

我需要粘貼A,B和C柱的考慮dat_group水平的值。行序列應該是相同的順序。如果我創建新的列爲dat_group作爲「價格」

dat_group$Price<-NA 

然後數據幀應該像;

Group Price 
1  A 21 
2  A 21 
3  A 21 
4  A 21 
5  A 15 
6  A 15 
7  A 15 
8  A 20 
9  A 20 
10  A 20 
11  C 24 
12  C 24 
13  C 24 
14  C 24 
15  C 10 
16  C 10 
17  C 10 
18  C 55 
19  C 55 
20  C 55 
21  B 45 
22  B 45 
23  B 45 
24  B 45 
25  B 11 
26  B 11 
27  B 11 
28  B 13 
29  B 13 
30  B 13 

我試圖做到這一點使用一些可用的例子e.g.1e.g.2,但沒有奏效。

請任何人都可以幫助我。這兩個示例數據幀可以通過以下代碼訪問。我的實際數據集有幾千行。

 dat_group<- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B", "C"), class = "factor")), .Names = "Group", class = "data.frame", row.names = c(NA, 
-30L)) 

    dat_price<-structure(list(A = c(21L, 21L, 21L, 21L, 15L, 15L, 15L, 20L, 
20L, 20L), B = c(45L, 45L, 45L, 45L, 11L, 11L, 11L, 13L, 13L, 
13L), C = c(24L, 24L, 24L, 24L, 10L, 10L, 10L, 55L, 55L, 55L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -10L)) 
+1

如果只有2個'A',再接2'B's等。在這種情況下應該輸出什麼?或者後果因素的數量是否與'dat_price'行相同? –

回答

0

爲您的問題提供更具防禦性的解決方案。希望即使您的所有因素水平都不是相同的倍數,這也是可行的。

library(dplyr); library(purrr); library(magrittr) 

dat_group$original_order <- seq(1:nrow(dat_group)) 

dat_group %<>% 
    split(.$Group) %>% 
    map(~ mutate(., Price = rep(na.omit(dat_price[,unique(Group)]), n()/length(na.omit(dat_price[,unique(Group)]))))) %>% 
    bind_rows() %>% 
    arrange(original_order) %>% 
    select(-original_order) 

dat_group 

    Group Price 
1  A 21 
2  A 21 
3  A 21 
4  A 21 
5  A 15 
6  A 15 
7  A 15 
8  A 20 
9  A 20 
10  A 20 
11  C 24 
12  C 24 
13  C 24 
14  C 24 
15  C 10 
16  C 10 
17  C 10 
18  C 55 
19  C 55 
20  C 55 
21  B 45 
22  B 45 
23  B 45 
24  B 45 
25  B 11 
26  B 11 
27  B 11 
28  B 13 
29  B 13 
30  B 13 

原件(懶惰)解決方案:

dat_group$Price <- rep(unlist(dat_price), length.out = nrow(dat_group)) 
+2

儘管這可能解決這個問題,但不難看出你沒有解決底層的挑戰。這個解決方案幸運地匹配,因爲A的後面總是跟着B的。 –

+0

@Nathan Day:謝謝,我想知道爲什麼行序列對我的數據不起作用。 – sriya

+1

這並不能確定該因素的相關水平。 – sriya

0
library(data.table) 
dat_price <- as.data.table(dat_price) 
dat_price_new <- cbind(dat_price[, c(1,3), with = FALSE], 
        dat_price[, 2, with = FALSE]) 
melt(dat_price_new) 
+0

此代碼對於我的實際數據集不可行,因爲我的實際數據集中的級別發生超過50次。 – sriya

相關問題