2016-06-21 51 views
0

我與隨後的一個模式的數據幀的工作通過dplyr變異:由一組特定的指數

Key  Data 
Loc  Place1 
Value1 6 
Value2 7 
Loc  Place2 
Value3 8 
Loc  Place3 
Value1 9 
Value2 10 
Loc  Place4 
Value3 11 

這是一個粗略的數據集,其中一個模式存在 - 在這個例子中,內sep(1,100,by=5)行將確定觀察的第一個位置。我的目的是爲了調整這些職位的關鍵是不同的,如LocA而非Loc爲了使spread(key,value)向我提供獨特的觀察,我可以用於進一步的分析:

LocA Value1 Value2 Loc Value3 
Place1  6  7 Place2  8 
Place3  9  10 Place4  11 

我一直在使用dplyr和一連串的其他變種,並選擇到這一點,所以我希望留在連鎖店。我可以看到如何通過鏈外的適當子集來完成此任務,但難以圍繞dplyr解決方案進行包裝。

+0

'。 %>%mutate(grp = rep(seq(1,100,by = 5),each = 5))%>%group_by(grp)%> mutate(Key = paste0(Key,grp))''開始,看起來醜陋。 – r2evans

+0

我忽略了注意,我確實創建了一個id/grp列,例如您顯示的那樣 - 問題只是將每個組的第一個「Loc」更改爲相同的新密鑰名稱,其他所有密鑰保持不變。我會給它更多的想法。 – jed

回答

1

您的數據:

df <- structure(list(Key = c("Loc", "Value1", "Value2", "Loc", "Value3", 
"Loc", "Value1", "Value2", "Loc", "Value3"), Data = c("Place1", 
"6", "7", "Place2", "8", "Place3", "9", "10", "Place4", "11")), .Names = c("Key", 
"Data"), row.names = c(NA, -10L), class = "data.frame") 

這是可行的?

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(grp = (row_number() - 1) %/% 5) %>% 
    group_by(grp) %>% 
    mutate(
    Key = ifelse(! duplicated(Key), Key, paste0(Key, "A")) 
) %>% 
    ungroup() %>% 
    spread(Key, Data) %>% 
    select(-grp) 
# Source: local data frame [2 x 5] 
#  Loc LocA Value1 Value2 Value3 
# * <chr> <chr> <chr> <chr> <chr> 
# 1 Place1 Place2  6  7  8 
# 2 Place3 Place4  9  10  11 
+0

太棒了。它也容納我忽視的東西 - 我有另一個重複的鍵(代表與LocA相關的其他屬性)。我很抱歉沒有像您所做的那樣以更好的格式提供數據。 – jed

1

這是另一種方法。我承認這個規模不會像上面的r2evans一樣好。

df <- structure(list(Key = c("Loc", "Value1", "Value2", "Loc", "Value3", 
"Loc", "Value1", "Value2", "Loc", "Value3"), Data = c("Place1", 
"6", "7", "Place2", "8", "Place3", "9", "10", "Place4", "11")), .Names = c("Key", 
"Data"), row.names = c(NA, -10L), class = "data.frame") 

library(dplyr) 
library(tidry) 

df %>% 
    mutate(gid = ceiling(row_number()/5)) %>% 
    group_by(gid) %>% 
    summarize(concatenated_text = str_c(Data, collapse = ",")) %>% 
    separate(concatenated_text, into = c("LocA", "Value1", "Value2", "Loc", "Value3"), sep=",") 
+0

謝謝你的回答。這讓我意識到我需要深入挖掘'stringr'。我沒有在組內使用'separate'來考慮'str_c'。 – jed