【问题标题】:reshape dataframe with missing values in tidyr在 tidyr 中使用缺失值重塑数据框
【发布时间】:2019-03-27 14:02:34
【问题描述】:

我有一个像这样的数据框:

library(tidyverse) 

df_mess <- tibble::tribble(
  ~id, ~value, ~answer_text,
  123,     25,        "age",
  123,     NA,     "female",
  234,     29,        "age",
  234,     NA,       "male",
  345,     14,        "age",
  345,     NA,     "female"
  )

我想以一种具有“整洁”数据的方式进行重塑,即每次观察 1 行。

df <- tibble::tribble(
  ~id, ~age,     ~sex,
  123,   25, "female",
  234,   29,   "male",
  345,   14, "female"
  )

我尝试了gather / spread 的一个版本,但我没有运气。

感谢任何线索。

【问题讨论】:

  • 嗨@xxxvinxxx。我只是想检查一下,看看提供的答案是否解决了您的问题。如果没有,您介意告诉我们为什么没有吗?谢谢!

标签: r dplyr tidyverse tidyr


【解决方案1】:

这是一个带有传播和聚集的解决方案。 spread 将获取所有变量,例如 age,其中变量的名称出现在 answer_text 列中。如果变量的值在 answer_text 列中(如本例中的性别),您将需要gather 这些返回,如下所示。

为了让性别栏正常工作,我将value 中的NAs 更改为-99。不过,您可以使用任何值。如果您在 value 列中没有任何内容的传播,它将在从传播创建的 femalemale 列中显示为 NA

df_mess[is.na(df_mess)] <- -99

df_mess %>% 
  spread(answer_text, value) %>% 
  gather(sex, temp, female, male, na.rm = TRUE) %>% 
  select(-temp)

输出

# A tibble: 3 x 3
     id   age sex   
  <dbl> <dbl> <chr> 
1   123    25 female
2   345    14 female
3   234    29 male 

size 变量中为id 123 提供更多变量和合法NA 的示例。

   df_mess <- tibble::tribble(
  ~id, ~value, ~answer_text,
  123,     25,        "age",
  123,     NA,     "female",
  234,     29,        "age",
  234,     NA,       "male",
  345,     14,        "age",
  345,     NA,     "female",
  123,     NA,      "brown",
  234,     NA,     "blonde",
  345,     NA,      "black",
  123,     NA,       "size",
  234,     30,       "size",
  345,     40,       "size",

)
df_mess[is.na(df_mess)] <- -99
df_clean <- df_mess %>% 
  spread(answer_text, value) %>% 
  gather(sex, temp, female, male, na.rm = TRUE) %>% 
  select(-temp) %>% 
  gather(hair, temp, black:brown, na.rm = TRUE) %>% 
  select(-temp)

df_clean[df_clean == -99] <- NA
df_clean

输出

     id   age  size sex    hair  
  <dbl> <dbl> <dbl> <chr>  <chr> 
1   345    14    40 female black 
2   234    29    30 male   blonde
3   123    25    NA female brown

【讨论】:

    【解决方案2】:

    如果您的数据结构始终相同,我会执行以下操作:

    df_mess$new <- lead(df_mess$answer_text)
    df_mess <- subset(df_mess,df_mess$value>0)
    

    但这只是针对这种特殊情况的可能解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2019-11-25
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多