【问题标题】:R Replace row values to the other rows based on/condition on column information in one data set?R 根据一个数据集中的列信息/条件将行值替换为其他行?
【发布时间】:2020-06-08 16:48:30
【问题描述】:

我收到了一个平面数据,但在平面数据时缺少这些值。 我必须根据 id、type 和 Date 以小时为单位将小时数增加到 NAs,以便以美元删除 NAs

id<-c(1,2,1,1,1,2,1)
dollar<-as.numeric(c(100,200,300,500, NA, NA,NA))
hours<-as.numeric(c(NA,NA, NA, NA, 5,10,12))
type<-c("Engineer", "Engineer","Operating","Part", "Engineer","Engineer","Operating" )
Date<-c("2020-01-02","2020-01-03","2020-01-02","2020-01-04", "2020-01-02","2020-01-03","2020-01-02")

  id dollar hours      type       Date
1  1    100  <NA>  Engineer 2020-01-02
2  2    200  <NA>  Engineer 2020-01-03
3  1    300  <NA> Operating 2020-01-02
4  1    500  <NA>      Part 2020-01-04
5  1   <NA>     5  Engineer 2020-01-02
6  2   <NA>    10  Engineer 2020-01-03
7  1   <NA>    12 Operating 2020-01-02

我想将我的数据改写如下。

  id dollar hours      type       Date
1   1     100      5  Engineer 2020-01-02
2   2     200     10  Engineer 2020-01-03
3   1     300     12 Operating 2020-01-02
4   1     500   <NA>      Part 2020-01-04

它不只是按 id 分组,而是与类型和日期匹配。 'id' 有类别,'type' 有 17 个类别,'Date' 是 3 年。

请帮帮我。

【问题讨论】:

  • 非常感谢!!

标签: r conditional-statements grouping


【解决方案1】:

这是tidyverse 的一种方法。您可以按idtypedate 分组,然后用可用值填充缺失的 NA。

library(tidyverse)

df %>%
  group_by(id, type, Date) %>%
  fill(c(dollar, hours), .direction = "updown") %>%
  slice(1)

输出

# A tibble: 4 x 5
# Groups:   id, type, Date [4]
     id dollar hours type      Date      
  <dbl>  <dbl> <dbl> <fct>     <fct>     
1     1    100     5 Engineer  2020-01-02
2     1    300    12 Operating 2020-01-02
3     1    500    NA Part      2020-01-04
4     2    200    10 Engineer  2020-01-03

【讨论】:

  • 非常感谢!!
【解决方案2】:

这是一个使用summarisedplyr 选项

library(dplyr)
df %>%
    group_by(id, type, Date) %>%
    summarise_at(vars(dollar, hours), ~mean(.x, na.rm = T))
## A tibble: 4 x 5
## Groups:   id, type [4]
#     id type      Date       dollar hours
#  <dbl> <fct>     <fct>       <dbl> <dbl>
#1     1 Engineer  2020-01-02    100     5
#2     1 Operating 2020-01-02    300    12
#3     1 Part      2020-01-04    500   NaN
#4     2 Engineer  2020-01-03    200    10

甚至

df %>% group_by(id, type, Date) %>% summarise_all(~mean(.x, na.rm = T))

样本数据

df <- data.frame(id, dollar, hours, type, Date)

【讨论】:

  • 非常感谢!!
【解决方案3】:

或者,您可以使用 tidyr 中的 pivot_longerpivot_wider 函数将数据集重新整形为更长的格式,删除 NA 值,然后重新整形为更宽的格式:

library(dplyr)
library(tidyr)
DF %>% pivot_longer(cols = c(dollar, hours), names_to = "var", values_to = "val") %>%
  filter(!is.na(val)) %>% pivot_wider(names_from = var, values_from = val)

# A tibble: 4 x 5
     id type      Date       dollar hours
  <dbl> <fct>     <fct>       <dbl> <dbl>
1     1 Engineer  2020-01-02    100     5
2     2 Engineer  2020-01-03    200    10
3     1 Operating 2020-01-02    300    12
4     1 Part      2020-01-04    500    NA

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多