在R中的不同数据帧之间替换值

在R中的不同数据帧之间替换值,r,dataframe,replace,substitution,R,Dataframe,Replace,Substitution,我有以下4个数据帧的代码。每个的最后一列只有两个值,零(“0”)或一个id,这在每个df中是相同的,但在每个df之间是不同的 如何用id列中的所有零替换所有相同的id 例如,将df1更改为: year counts id 1 2015 0 0 2 2016 0 0 3 2017 7 Fg4s5 4 2018 8 Fg4s5 5 2019 5

我有以下4个数据帧的代码。每个的最后一列只有两个值,零(“0”)或一个id,这在每个
df
中是相同的,但在每个
df
之间是不同的

如何用
id
列中的所有零替换所有相同的id

例如,将df1更改为:

     year    counts    id
 1   2015    0         0
 2   2016    0         0
 3   2017    7         Fg4s5
 4   2018    8         Fg4s5
 5   2019    5         0
 6   2020    12        Fg4s5
致:

其他
df
s及其ID也一样

数据帧代码:

 df1 <- data.frame(
   year = c(2015:2020),
   counts = c(0, 0, 7, 8, 5, 12),
   id = c(0, 0, "Fg4s5", "Fg4s5", 0, "Fg4s5")
 )
 df2 <- data.frame(
   year = c(2014:2020),
   counts = c(1, 5, 9, 2, 2, 19, 3),
   id = c(0, 0, 0, 0, 0, "Qd8a2", "Qd8a2")
 )
 df3 <- data.frame(
   year = c(2016:2020),
   counts = c(0, 0, 0, 0, 6),
   id = c(0, 0, "Wk9l4", "Wk9l4", "Wk9l4")
 )
 df4 <- data.frame(
   year = c(2014:2020),
   counts = c(0, 0, 8, 1, 9, 12, 23),
   id = c(0, "Rd7q0", 0, 0, "Rd7q0", "Rd7q0", "Rd7q0")
 )

df1将数据帧放入列表中,并使用
lappy
更改
id
列中的值:

list_df <- list(df1, df2, df3, df4)

lapply(list_df, function(x) {
  transform(x, id = replace(id, id == 0, id[id != '0'][1]))
}) -> list_df

list_df

#[[1]]
#  year counts    id
#1 2015      0 Fg4s5
#2 2016      0 Fg4s5
#3 2017      7 Fg4s5
#4 2018      8 Fg4s5
#5 2019      5 Fg4s5
#6 2020     12 Fg4s5

#[[2]]
#  year counts    id
#1 2014      1 Qd8a2
#2 2015      5 Qd8a2
#3 2016      9 Qd8a2
#4 2017      2 Qd8a2
#5 2018      2 Qd8a2
#6 2019     19 Qd8a2
#7 2020      3 Qd8a2

#[[3]]
#  year counts    id
#1 2016      0 Wk9l4
#2 2017      0 Wk9l4
#3 2018      0 Wk9l4
#4 2019      0 Wk9l4
#5 2020      6 Wk9l4

#[[4]]
#  year counts    id
#1 2014      0 Rd7q0
#2 2015      0 Rd7q0
#3 2016      8 Rd7q0
#4 2017      1 Rd7q0
#5 2018      9 Rd7q0
#6 2019     12 Rd7q0
#7 2020     23 Rd7q0
list\u df list\u df
列表
#[[1]]
#年份计数id
#1 2015 0 Fg4s5
#2 2016 0 Fg4s5
#2017年3月7日Fg4s5
#2018年4月8日Fg4s5
#5 2019 5 Fg4s5
#6 2020 12 Fg4s5
#[[2]]
#年份计数id
#2014年1月1日Qd8a2
#2 2015 5 Qd8a2
#2016年3月9日Qd8a2
#2017年4月2日Qd8a2
#2018年5月2日Qd8a2
#2019年6月19日Qd8a2
#7 2020 3 Qd8a2
#[[3]]
#年份计数id
#1 2016 0 Wk9l4
#2017年2月0日Wk9l4
#2018年3月0日Wk9l4
#4 20190 Wk9l4
#5 2020 6 Wk9l4
#[[4]]
#年份计数id
#1 2014 0 Rd7q0
#2 2015 0 Rd7q0
#2016年3月8日Rd7q0
#2017年4月1日Rd7q0
#2018年5月9日Rd7q0
#2019年6月12日Rd7q0
#7 2020 23 Rd7q0
将它们放在单独的数据帧中

names(list_df) <- paste0('df', 1:4)
list2env(list_df, .GlobalEnv)

names(list_df)将数据帧放入列表中,并使用
lappy
更改
id
列中的值:

list_df <- list(df1, df2, df3, df4)

lapply(list_df, function(x) {
  transform(x, id = replace(id, id == 0, id[id != '0'][1]))
}) -> list_df

list_df

#[[1]]
#  year counts    id
#1 2015      0 Fg4s5
#2 2016      0 Fg4s5
#3 2017      7 Fg4s5
#4 2018      8 Fg4s5
#5 2019      5 Fg4s5
#6 2020     12 Fg4s5

#[[2]]
#  year counts    id
#1 2014      1 Qd8a2
#2 2015      5 Qd8a2
#3 2016      9 Qd8a2
#4 2017      2 Qd8a2
#5 2018      2 Qd8a2
#6 2019     19 Qd8a2
#7 2020      3 Qd8a2

#[[3]]
#  year counts    id
#1 2016      0 Wk9l4
#2 2017      0 Wk9l4
#3 2018      0 Wk9l4
#4 2019      0 Wk9l4
#5 2020      6 Wk9l4

#[[4]]
#  year counts    id
#1 2014      0 Rd7q0
#2 2015      0 Rd7q0
#3 2016      8 Rd7q0
#4 2017      1 Rd7q0
#5 2018      9 Rd7q0
#6 2019     12 Rd7q0
#7 2020     23 Rd7q0
list\u df list\u df
列表
#[[1]]
#年份计数id
#1 2015 0 Fg4s5
#2 2016 0 Fg4s5
#2017年3月7日Fg4s5
#2018年4月8日Fg4s5
#5 2019 5 Fg4s5
#6 2020 12 Fg4s5
#[[2]]
#年份计数id
#2014年1月1日Qd8a2
#2 2015 5 Qd8a2
#2016年3月9日Qd8a2
#2017年4月2日Qd8a2
#2018年5月2日Qd8a2
#2019年6月19日Qd8a2
#7 2020 3 Qd8a2
#[[3]]
#年份计数id
#1 2016 0 Wk9l4
#2017年2月0日Wk9l4
#2018年3月0日Wk9l4
#4 20190 Wk9l4
#5 2020 6 Wk9l4
#[[4]]
#年份计数id
#1 2014 0 Rd7q0
#2 2015 0 Rd7q0
#2016年3月8日Rd7q0
#2017年4月1日Rd7q0
#2018年5月9日Rd7q0
#2019年6月12日Rd7q0
#7 2020 23 Rd7q0
将它们放在单独的数据帧中

names(list_df) <- paste0('df', 1:4)
list2env(list_df, .GlobalEnv)

使用
purrr::map

map(list(df1, df2, df3, df4),  ~ .x %>% mutate(id = first(id[id != "0"])))

[[1]]
  year counts    id
1 2015      0 Fg4s5
2 2016      0 Fg4s5
3 2017      7 Fg4s5
4 2018      8 Fg4s5
5 2019      5 Fg4s5
6 2020     12 Fg4s5

[[2]]
  year counts    id
1 2014      1 Qd8a2
2 2015      5 Qd8a2
3 2016      9 Qd8a2
4 2017      2 Qd8a2
5 2018      2 Qd8a2
6 2019     19 Qd8a2
7 2020      3 Qd8a2

[[3]]
  year counts    id
1 2016      0 Wk9l4
2 2017      0 Wk9l4
3 2018      0 Wk9l4
4 2019      0 Wk9l4
5 2020      6 Wk9l4

[[4]]
  year counts    id
1 2014      0 Rd7q0
2 2015      0 Rd7q0
3 2016      8 Rd7q0
4 2017      1 Rd7q0
5 2018      9 Rd7q0
6 2019     12 Rd7q0
7 2020     23 Rd7q0


使用
purrr::map

map(list(df1, df2, df3, df4),  ~ .x %>% mutate(id = first(id[id != "0"])))

[[1]]
  year counts    id
1 2015      0 Fg4s5
2 2016      0 Fg4s5
3 2017      7 Fg4s5
4 2018      8 Fg4s5
5 2019      5 Fg4s5
6 2020     12 Fg4s5

[[2]]
  year counts    id
1 2014      1 Qd8a2
2 2015      5 Qd8a2
3 2016      9 Qd8a2
4 2017      2 Qd8a2
5 2018      2 Qd8a2
6 2019     19 Qd8a2
7 2020      3 Qd8a2

[[3]]
  year counts    id
1 2016      0 Wk9l4
2 2017      0 Wk9l4
3 2018      0 Wk9l4
4 2019      0 Wk9l4
5 2020      6 Wk9l4

[[4]]
  year counts    id
1 2014      0 Rd7q0
2 2015      0 Rd7q0
3 2016      8 Rd7q0
4 2017      1 Rd7q0
5 2018      9 Rd7q0
6 2019     12 Rd7q0
7 2020     23 Rd7q0


很好,谢谢!我如何应用这些更改,使df1-df4仍然是单独的df1-df4?更新了答案。哇,太棒了。节省了我这么多时间!谢谢,很好,谢谢!我如何应用这些更改,使df1-df4仍然是单独的df1-df4?更新了答案。哇,太棒了。节省了我这么多时间!谢谢。很好的解决方案!格雷西亚斯,很好的解决方案!格雷西亚斯。