合并数据帧并用R中的多个条件替换值(1> 0> NA)

时间:2017-02-07 17:26:02

标签: r replace merge append conditional

这是我第一次发帖,所以如果我没有正确理解,我会道歉。我一直在阅读很多以前的帖子,但仍然无法弄清楚我的合并和替换问题。

我需要将多个检测历史与替换合并。这些数据帧的大小相等(80条记录和25列)。每张表的第1-12列描述了站点,并为每个数据框包含相同的值。第13-25列包含给定站点的检测/非检测数据的响应变量。检测列中的值可以是NA,0或1.合并时,我需要将NAs替换为任意0或1值,将0值替换为任意1个值。基本上,1> 0> NA。

我试图说明下面合并的目标。

例如,如果我想合并/替换下面的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

建议的代码将不胜感激,谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

你走了:

以数据框为例:

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

结果:

string localIP;

        try
        {
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP))
            {
                socket.Connect("8.8.8.8", 65530);
                IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
                localIP = endPoint.Address.ToString();
            }
        }
        catch (Exception ex)
        {
            localIP = String.Empty;
        }

        return localIP;

这将使用df1中的值替换df2中的所有NA。然后它将在df1较大但不是NA的那些地方用0替换0。

答案 1 :(得分:1)

我认为你可以用一个简单的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