使用数据框合并填充NAs

时间:2016-06-22 00:40:50

标签: r dataframe merge

我有一个像这样的数据框c

c
             Freq      CTM
000110100111    2       NA
110110100111    1 32.58847
111001011000    2       NA
111111111111    1 25.61041

和像这样的数据框nona_c

   nona_c 
             Freq     CTM
000110100111    2 37.0642
111001011000    2 37.0642

我想将CTM c列中的NA替换为nona_c的CTM值。 nona_c(二进制字符串)的rownames将始终存在于c中。

输出应为

mergedC
             Freq      CTM
000110100111    2  37.0642
110110100111    1 32.58847
111001011000    2  37.0642
111111111111    1 25.61041

我一直在尝试merge但没有成功。

mergedC  <- merge(x = c, y = nona_c, by = 0, #rownames
    all.y = TRUE)

2 个答案:

答案 0 :(得分:4)

match操作可能会使这更直接:

c$CTM[is.na(c$CTM)] <- nona_c$CTM[match(rownames(c)[is.na(c$CTM)], rownames(nona_c))]

#             Freq      CTM           id
#000110100111    2 37.06420 000110100111
#110110100111    1 32.58847 110110100111
#111001011000    2 37.06420 111001011000
#111111111111    1 25.61041 111111111111

答案 1 :(得分:2)

我们可以使用data.table使用感兴趣的变量on来执行此操作。这里我们加入行名列。 &#34; i.CTM&#34;的值被分配(:=)到&#39; CTM&#39;。

library(data.table)
setDT(c, keep.rownames=TRUE)[]
setDT(nona_c, keep.rownames=TRUE)[]

c[nona_c, CTM := i.CTM , on = "rn"]
c
#             rn Freq      CTM
#1: 000110100111    2 37.06420
#2: 110110100111    1 32.58847
#3: 111001011000    2 37.06420
#4: 111111111111    1 25.61041

注意:row.names不会保留在data.tabledplyr中。因此,在转换&#39; data.frame&#39;要使用keep.rownames = TRUE

,我们会使用(function () { 'use strict'; angular .module('scheduling') .controller('ScheduleCtrl', ['$scope', '$rootScope', '$log', '$filter', function ($scope, $rootScope, $log, $filter) { $scope.selectedDay = function () { $rootScope.day = Object.keys($scope.day).map(key => $scope.day[key]); $rootScope.day = $scope.day; $rootScope.schedule.weekdays.day['@'].day = $rootScope.day; console.log($rootScope.day); } }]); })();