按行号将e1071 matchControls的结果添加回原始数据

时间:2018-12-22 13:25:41

标签: r dataframe indexing subset matching

我想使用数据的子集进行1:1匹配,然后将输出代码作为新列添加到我的原始数据中。这是一个使用示例数据的工作示例:

mydata <- iris
dfrm <- subset(mydata, mydata$Petal.Length>4)
library(e1071)
m <- matchControls(Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,
                   data = dfrm, caselabel = "versicolor", contlabel = "virginica")

输出中包含原始行号,我希望在附加到原始数据时使用该行号。

m$factor 
# 51   52   53   55   56   57   59   62   64   66   67   68   69   71   73   74   75   76   77 
# case case case case case case case case case case case case case case case case case case case 
# 78   79   84   85   86   87   88   89   91   92   95   96   97   98  100  101  102  103  104 
# case case case case case case case case case case case case case case case <NA> cont <NA> cont 
# 105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123 
# cont <NA> cont <NA> cont <NA> cont cont cont cont cont cont cont <NA> <NA> cont <NA> cont <NA> 
#  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142 
# cont cont <NA> cont cont cont <NA> <NA> <NA> cont cont cont <NA> cont cont cont cont cont cont 
# 143  144  145  146  147  148  149  150 
# cont <NA> <NA> cont cont cont cont cont 

当我尝试将其作为新列直接添加到原始数据中时,由于行号不同,我收到一条错误消息:

mydata$output <- m$factor
# Error in `$<-.data.frame`(`*tmp*`, output, value = c(1L, 1L, 1L, 1L, 1L, :
# replacement has 84 rows, data has 150

我的搜索尝试失败了,也许是失败了,因为我不知道如何用正确的术语来描述我的问题。我尝试过“按行合并数据帧”等,而what I got似乎并不重要。一些自动建议的重复项,例如this one,是关于将汇总结果添加回原始数据的,这里不是这种情况。我尝试基于this answer使用join,但不知道如何将参数by定义为行号,而不是实际变量。

library(dplyr)
left_join(mydata, as.data.frame(m$factor), by=NULL)
# Error: `by` required, because the data sources have no common variables

我尝试了cbind,但是由于行号不同,它也会引发错误。

cbind(mydata, m$factor)
cbind(mydata, as.data.frame(m$factor))
# Error in data.frame(..., check.names = FALSE) : 
#   arguments imply differing number of rows: 150, 84

我想念什么?谢谢。

1 个答案:

答案 0 :(得分:1)

您将必须创建一个变量才能加入... 下面我使用行名...

library(dplyr)
left_join(mydata %>% mutate( rownumber = rownames(.) ),
          as.data.frame(m$factor) %>% mutate( rownumber = rownames(.) ), 
          by = "rownumber" )

#     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species rownumber m$factor
# 1            5.1         3.5          1.4         0.2     setosa         1     <NA>
# 2            4.9         3.0          1.4         0.2     setosa         2     <NA>
# 3            4.7         3.2          1.3         0.2     setosa         3     <NA>
# ...
# 96           5.7         3.0          4.2         1.2 versicolor        96     case
# 97           5.7         2.9          4.2         1.3 versicolor        97     case
# 98           6.2         2.9          4.3         1.3 versicolor        98     case
# 99           5.1         2.5          3.0         1.1 versicolor        99     <NA>
# 100          5.7         2.8          4.1         1.3 versicolor       100     case
# 101          6.3         3.3          6.0         2.5  virginica       101     <NA>
# 102          5.8         2.7          5.1         1.9  virginica       102     cont
# 103          7.1         3.0          5.9         2.1  virginica       103     <NA>
# 104          6.3         2.9          5.6         1.8  virginica       104     cont