2017-02-01 4 views
1

私は、この(これらは、最初の24行です)のように見えるのデータフレームがあります。垂直検索

row  Name   Age 
1  John   22 
2  Alice  29 
3  Michael  33 
4  Briefing  NA 
5  Class  A 
6  Year   2016 
7  Observation 0 
8  End   NA 
9  Steward  35 
10  Louis  20 
11  Josh   22 
12  Marie  39 
13  Briefing  NA 
14  Observation 2 
15  Year   2017 
16  End   NA 
17  Adam   27 
18  Joseph  26 
19  Andrew  26 
20  Briefing  NA 
21  Observation 2 
22  Year   2017 
23  Class  B 
24  End   NA 

私はそれが私がいることを理解し、この

 Name Age Class Year Observation 
    John 22 A  2016 0 
    Alice 29 A  2016 0 
    Michael 33 A  2016 0 
    Steward 35 NA  2017 2 
    Louis 20 NA  2017 2 
    Josh 22 NA  2017 2 
    Marie 39 NA  2017 2 
    Adam 27 B  2017 2 
    Joseph 26 B  2017 2 
    Andrew 26 B  2017 2

に見えるようにしたいがこのプロセスには次のことが必要です。

  • "ブリーフィング"という単語から "エンド"という単語にデータを転送する必要があるすべての範囲を検出します。
  • また、コンポーネントが変更されているので、最初のグループは情報を「クラス」、「年」および「観測」の列に転送し、2番目のグループは「年」列のみに情報を転送します。 「観測」はNA値で列「クラス」を残す。第3のグループは、「クラス」、「年」、および「観察」の列に関する情報をもう一度提供します。

私はR.

を編集して、このタスクに取り組むためにあなたの助けに感謝し、次のようになります。ここではdput

structure(list(row = 1:24, Name = structure(c(7L, 2L, 12L, 4L, 
5L, 15L, 13L, 6L, 14L, 10L, 9L, 11L, 4L, 13L, 15L, 6L, 1L, 8L, 
3L, 4L, 13L, 15L, 5L, 6L), .Label = c("Adam", "Alice", "Andrew", 
"Briefing", "Class", "End", "John", "Joseph", "Josh", "Louis", 
"Marie", "Michael", "Observation", "Steward", "Year"), class = "factor"), 
    Age = structure(c(6L, 9L, 10L, NA, 13L, 4L, 1L, NA, 11L, 
    3L, 6L, 12L, NA, 2L, 5L, NA, 8L, 7L, 7L, NA, 2L, 5L, 14L, 
    NA), .Label = c("0", "2", "20", "2016", "2017", "22", "26", 
    "27", "29", "33", "35", "39", "A", "B"), class = "factor")), .Names = c("row", 
"Name", "Age"), class = "data.frame", row.names = c(NA, -24L)) 
+1

データを投稿するために 'dput'を使用できますか? – gfgm

+0

こんにちはガブリエル。絶対に。私は郵便を編集し、そこに議員を置いた。ありがとう。 – dena76

+0

あなたはcsvまたはexcelシートからデータを読んでいますか? – OdeToMyFiddle

答えて

1

は基本的にあなたが行方向に一緒にsmushed 2つのデータフレームを持っています。私たちはそれらを分けて、列方向に一緒に戻し合います。

library(dplyr) 
library(tidyr) 

# flag rows as being part of the "lookup" data frame 
# and add a grouping so we know which lookup values belong with which data values 
df = mutate(df, group = cumsum(df$Name == "End"), 
     is_lookup = cumsum(Name == "Briefing") > cumsum(Name == "End") | Name == "End") %>% 
    select(-row) 

# break off the lookup data and make it wide 
lookup = filter(df, is_lookup, 
       ! Name %in% c("Briefing", "End")) %>% 
    spread(key = Name, value = Age) 

# break off the non-lookup data and join it to the wide lookup 
df %>% filter(!is_lookup) %>% 
    select(Name, group) %>% 
    left_join(lookup) %>% 
    select(-group, -is_lookup) 
# Joining, by = "group" 
#  Name Class Observation Year 
# 1  John  A   0 2016 
# 2 Alice  A   0 2016 
# 3 Michael  A   0 2016 
# 4 Steward <NA>   2 2017 
# 5 Louis <NA>   2 2017 
# 6  Josh <NA>   2 2017 
# 7 Marie <NA>   2 2017 
# 8  Adam  B   2 2017 
# 9 Joseph  B   2 2017 
# 10 Andrew  B   2 2017 
+0

こんにちはグレゴール、私の遅い応答にごめんなさい。この仕事に取り組んでいただきありがとうございます。この手順は、スムージングされたデータフレームから転置される必要がある可能性のある列をすべて追跡するので、非常に効率的でした。 – dena76