合并数据框并用 R (1 > 0 > NA) 中的多个条件替换值
Merging dataframes and replacing values with multiple conditions in R (1 > 0 > NA)
这是我第一次发帖,所以如果我的行话不正确,我深表歉意。我已经阅读了很多以前的帖子,但仍然无法弄清楚我的合并和替换问题。
我需要用替换合并多个检测历史。这些数据框的大小都相等(80 条记录和 25 列)。每个 sheet 的第 1-12 列描述了站点并包含每个数据框的相同值。第 13-25 列包含给定站点 detection/nondetection 数据的响应变量。检测列中的值可以是 NA、0 或 1。合并时,我需要将 NA 替换为任何 0 或 1 值,并将 0 值替换为任何 1 值。基本上,1 > 0 > NA。
我试图在下面说明我的合并目标。
例如,如果我想 merge/replace 下面的 df1 和 df2...
df1 d1 d2 d3
site1 0 1 1
site2 0 NA NA
site3 0 0 0
site4 1 NA NA
df2 d1 d2 d3
site1 0 0 NA
site2 0 1 0
site3 0 0 NA
site4 1 0 NA
我需要结束...
df3 d1 d2 d3
site1 0 1 1
site2 0 1 0
site3 0 0 0
site4 1 0 NA
非常感谢您提供建议的代码,感谢您的宝贵时间!
给你:
以您的数据框为例:
df1 = data.frame(d1=c(0,0,0, 1), d2=c(1,NA,0,NA), d3=c(1,NA,0,NA))
df2 = data.frame(d1=c(0,0,0, 1), d2=c(0,1,0,0), d3=c(NA,0,NA,NA))
使用这个:
df2[is.na(df2)] = df1[is.na(df2)]
df2[df1>df2 & !is.na(df1)] = df1[df1>df2 & !is.na(df1)]
结果:
> df2
d1 d2 d3
1 0 1 1
2 0 1 0
3 0 0 0
4 1 0 NA
这将使用 df1 中的值替换 df2 中的所有 NA。然后它会在那些df1较大而不是NA的地方用1替换0。
我想你可以用一个简单的pmax
(并行最大值)来得到这个。它最自然地适用于矩阵,而不是数据框。使用@R Schifini 的数据:
pmax(as.matrix(df1), as.matrix(df2), na.rm = T)
# d1 d2 d3
# [1,] 0 1 1
# [2,] 0 1 0
# [3,] 0 0 0
# [4,] 1 0 NA
这是我第一次发帖,所以如果我的行话不正确,我深表歉意。我已经阅读了很多以前的帖子,但仍然无法弄清楚我的合并和替换问题。
我需要用替换合并多个检测历史。这些数据框的大小都相等(80 条记录和 25 列)。每个 sheet 的第 1-12 列描述了站点并包含每个数据框的相同值。第 13-25 列包含给定站点 detection/nondetection 数据的响应变量。检测列中的值可以是 NA、0 或 1。合并时,我需要将 NA 替换为任何 0 或 1 值,并将 0 值替换为任何 1 值。基本上,1 > 0 > NA。
我试图在下面说明我的合并目标。
例如,如果我想 merge/replace 下面的 df1 和 df2...
df1 d1 d2 d3
site1 0 1 1
site2 0 NA NA
site3 0 0 0
site4 1 NA NA
df2 d1 d2 d3
site1 0 0 NA
site2 0 1 0
site3 0 0 NA
site4 1 0 NA
我需要结束...
df3 d1 d2 d3
site1 0 1 1
site2 0 1 0
site3 0 0 0
site4 1 0 NA
非常感谢您提供建议的代码,感谢您的宝贵时间!
给你:
以您的数据框为例:
df1 = data.frame(d1=c(0,0,0, 1), d2=c(1,NA,0,NA), d3=c(1,NA,0,NA))
df2 = data.frame(d1=c(0,0,0, 1), d2=c(0,1,0,0), d3=c(NA,0,NA,NA))
使用这个:
df2[is.na(df2)] = df1[is.na(df2)]
df2[df1>df2 & !is.na(df1)] = df1[df1>df2 & !is.na(df1)]
结果:
> df2
d1 d2 d3
1 0 1 1
2 0 1 0
3 0 0 0
4 1 0 NA
这将使用 df1 中的值替换 df2 中的所有 NA。然后它会在那些df1较大而不是NA的地方用1替换0。
我想你可以用一个简单的pmax
(并行最大值)来得到这个。它最自然地适用于矩阵,而不是数据框。使用@R Schifini 的数据:
pmax(as.matrix(df1), as.matrix(df2), na.rm = T)
# d1 d2 d3
# [1,] 0 1 1
# [2,] 0 1 0
# [3,] 0 0 0
# [4,] 1 0 NA