R是否根据一个数据集中的列信息/条件将行值替换为其他行?

R是否根据一个数据集中的列信息/条件将行值替换为其他行?,r,conditional-statements,grouping,R,Conditional Statements,Grouping,我收到了一个平面数据,在平面化数据时缺少值。 我必须根据id、类型和日期,以小时为单位计算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", "Eng

我收到了一个平面数据,在平面化数据时缺少值。 我必须根据id、类型和日期,以小时为单位计算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这里有一种使用
tidyverse
的方法。您可以按
id
类型
日期
进行分组,然后用可用值填充缺少的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
#一个tible:4 x 5
#组:id、类型、日期[4]
id美元小时数类型日期
11005工程师2020-01-02
2130012运营2020-01-02
3 1500 NA第2020-01-04部分
420010工程师2020-01-03

这里有一个使用
摘要的
dplyr
选项

库(dplyr)
df%>%
分组依据(id、类型、日期)%>%
总结(变量(美元,小时)~平均值(.x,na.rm=T))
##一个tibble:4x5
##组:id,类型[4]
#id类型日期美元小时数
#                
#工程师2020-01-02 100 5
#2 1运营2020-01-02 300 12
#3第1部分2020-01-04 500 NaN
#工程师2020-01-03 200 10
甚至

df%>%分组依据(id、类型、日期)%>%汇总所有(~mean(.x,na.rm=T))

样本数据
df或者,您可以使用
tidyr
中的
pivot\u longer
pivot\u wide
功能将数据集重塑为更长的格式,删除NA值,然后重塑为更宽的格式:

库(dplyr)
图书馆(tidyr)
DF%>%pivot\u更长(cols=c(美元,小时),名称\u to=“var”,值\u to=“val”)%>%
过滤器(!is.na(val))%>%pivot\u更宽(名称\u from=var,值\u from=val)
#一个tibble:4x5
id类型日期美元小时数
工程师2020-01-02 100 5
工程师2020-01-03 200 10
3.1运营2020-01-02 300 12
4 1第2020-01-04部分500 NA

非常感谢您!!非常感谢你!!非常感谢你!!
# 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