R Заменить значения строки на другие строки, основываясь на / условие для информации столбца в одном наборе данных? - PullRequest
4 голосов
/ 25 февраля 2020

Я получил плоские данные, и значения отсутствовали при выравнивании данных. Я должен довести часы до NA в часах, основываясь на идентификаторе, типе и дате, чтобы удалить NA в долларах

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» имеет категории, «type» имеет 17 категорий, а «Date» - 3 года.

Пожалуйста, помогите мне в этом.

Ответы [ 3 ]

4 голосов
/ 25 февраля 2020

Вот вариант dplyr с использованием summarise

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)
2 голосов
/ 25 февраля 2020

В качестве альтернативы, вы можете использовать функции pivot_longer и pivot_wider из tidyr, чтобы преобразовать ваш набор данных в более длинный формат, удалить значения 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
2 голосов
/ 25 февраля 2020

Вот один подход с tidyverse. Вы можете сгруппировать по id, type и date, а затем заполнить отсутствующий 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
...