Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 以编程方式查找、更正具有不同列和行长度的数据帧中的ID_R_Dplyr - Fatal编程技术网

R 以编程方式查找、更正具有不同列和行长度的数据帧中的ID

R 以编程方式查找、更正具有不同列和行长度的数据帧中的ID,r,dplyr,R,Dplyr,我有两个不同长度和宽度的数据帧。这两个网站都包含数年的网站面板数据,每个网站都有一个唯一的ID代码。但是,这些唯一的ID代码在数据帧之间的某些站点上被更改。例如: Year <- c(2006,2006,2006,2006) Name <- as.character(c("A","B","C","D.B")) Qtr.2 <- as.numeric(c(14,32,62,40)) Code <- as.character(c(123,456,789,101)) DF1 &

我有两个不同长度和宽度的数据帧。这两个网站都包含数年的网站面板数据,每个网站都有一个唯一的ID代码。但是,这些唯一的ID代码在数据帧之间的某些站点上被更改。例如:

Year <- c(2006,2006,2006,2006)
Name <- as.character(c("A","B","C","D.B"))
Qtr.2 <- as.numeric(c(14,32,62,40))
Code <- as.character(c(123,456,789,101))
DF1 <- data.frame(Year,Name,Qtr.2,Code,stringsAsFactors = FALSE)

Year2 <- c(2007,2007,2007,2007,2007,2007)
Name2 <- as.character(c("A","B","C","E","D.B","D.A"))
Qtr.3 <- as.numeric(c(14,32,62,11,40,20))
Code2 <- as.character(c("W33","456","789","121","W133","W111"))
Type <- as.character(c("Blue","Red","Red","Green","Blue","Red"))
DF2 <- data.frame(Year2,Name2,Qtr.3,Code2,Type,stringsAsFactors = FALSE)

> DF1
     Year Name Qtr.2 Code
   1 2006    A    14  123
   2 2006    B    32  456
   3 2006    C    62  789
   4 2006  D.B    40  101

> DF2
    Year2 Name2 Qtr.3 Code2 Type
  1  2007     A    14   W33  Blue
  2  2007     B    32   456   Red
  3  2007     C    62   789   Red
  4  2007     E    11   121 Green
  5  2007   D.B    40  W133  Blue
  6  2007   D.A    20  W111   Red

Year尝试使用
match
命令:

DF2 <- within(DF2, {
  ind <- match(Name2, DF1$Name)
  new_code <- DF1$Code[ind]
  Code_fixed <- ifelse(is.na(ind), as.character(Code2), as.character(new_code))
  rm(ind, new_code)
})
DF2

DF2解决方案是使用
dplyr::coalesce
left\u join
来获得所需的结果

library(dplyr)

DF2 %>% left_join(select(DF1, Name, Code), by=c("Name2" = "Name")) %>%
  mutate(Code2 = coalesce(Code, Code2)) %>%
  select(-Code)

#   Year2 Name2 Qtr.3 Code2  Type
# 1  2007     A    14   123  Blue
# 2  2007     B    32   456   Red
# 3  2007     C    62   789   Red
# 4  2007     E    11   121 Green
# 5  2007   D.B    40   101  Blue
# 6  2007   D.A    20  W111   Red
注意:
stringsAsFactors=FALSE
已添加到OP的代码中以创建data.frames,否则将生成不必要的警告

数据:

Year <- c(2006,2006,2006,2006)
Name <- as.character(c("A","B","C","D.B"))
Qtr.2 <- as.numeric(c(14,32,62,40))
Code <- as.character(c(123,456,789,101))
DF1 <- data.frame(Year,Name,Qtr.2,Code, stringsAsFactors = FALSE)

Year2 <- c(2007,2007,2007,2007,2007,2007)
Name2 <- as.character(c("A","B","C","E","D.B","D.A"))
Qtr.3 <- as.numeric(c(14,32,62,11,40,20))
Code2 <- as.character(c("W33","456","789","121","W133","W111"))
Type <- as.character(c("Blue","Red","Red","Green","Blue","Red"))
DF2 <- data.frame(Year2,Name2,Qtr.3,Code2,Type, stringsAsFactors = FALSE)
年份
Year <- c(2006,2006,2006,2006)
Name <- as.character(c("A","B","C","D.B"))
Qtr.2 <- as.numeric(c(14,32,62,40))
Code <- as.character(c(123,456,789,101))
DF1 <- data.frame(Year,Name,Qtr.2,Code, stringsAsFactors = FALSE)

Year2 <- c(2007,2007,2007,2007,2007,2007)
Name2 <- as.character(c("A","B","C","E","D.B","D.A"))
Qtr.3 <- as.numeric(c(14,32,62,11,40,20))
Code2 <- as.character(c("W33","456","789","121","W133","W111"))
Type <- as.character(c("Blue","Red","Red","Green","Blue","Red"))
DF2 <- data.frame(Year2,Name2,Qtr.3,Code2,Type, stringsAsFactors = FALSE)