繁体   English   中英

保留匹配并删除不匹配观察的列和行

[英]keep columns and rows which match and drop unmatched observations

我有一些数据看起来像:

         08183  0818401  0818402  0818403  0818404  0818701  0818702  0818703  0818704  0818705  0818706
0818402 17.197 1970.236 2428.928 2575.462 8749.347  277.701   66.621  207.539  198.159  262.511  169.777
0818403   NULL 2237.263 2596.949 3293.467 12434.01  179.947  138.772  153.711   144.64  128.542  163.082
0818404  3.407 7631.144 8982.463 11995.12 36507.17  615.594  346.328  447.489  352.306  502.078   710.92
0818701   NULL  308.932  213.145  239.574  667.364 50675.95  16698.7 6186.076 11050.89 14711.44 12028.52
0818702   NULL   78.857  160.983  108.902  267.145 17014.93 8741.939 8226.877 10014.63  3911.77 2611.744
0818703   NULL   142.55  221.232  180.345  396.153 6146.109 8238.827 10457.78 13707.41 4461.576 2222.986
0818706   NULL  210.201  159.725  186.178  703.365 11449.72 2516.798 1841.649  2486.78 4405.838  6597.93
0818707   NULL    85.16   43.183   32.864  102.109 7992.958   3632.7 1459.469 1017.094 1261.304 1841.177
08191     NULL     NULL    3.816     NULL   28.399   12.293    4.212    9.464    8.387    9.537    4.212
08192    5.008   13.273    7.808     NULL     NULL   20.849    6.059    6.059    9.965     NULL     NULL
08194     NULL   34.837   40.326   15.903   56.918  156.053   31.708  114.956   75.717  138.672  111.518

我只想保留出现在列名和行名中的观察结果。

> colnames(myData) %in% rownames(myData)
 [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE

所以,在这里它只会保留为TRUE的列和行。

数据:

structure(list(`08183` = list(17.197, NULL, 3.407, NULL, NULL, 
    NULL, NULL, NULL, NULL, 5.008, NULL), `0818401` = list(1970.236, 
    2237.263, 7631.144, 308.932, 78.857, 142.55, 210.201, 85.16, 
    NULL, 13.273, 34.837), `0818402` = list(2428.928, 2596.949, 
    8982.46299999999, 213.145, 160.983, 221.232, 159.725, 43.183, 
    3.816, 7.808, 40.326), `0818403` = list(2575.462, 3293.467, 
    11995.115, 239.574, 108.902, 180.345, 186.178, 32.864, NULL, 
    NULL, 15.903), `0818404` = list(8749.347, 12434.014, 36507.17, 
    667.364, 267.145, 396.153, 703.365, 102.109, 28.399, NULL, 
    56.918), `0818701` = list(277.701, 179.947, 615.594, 50675.952, 
    17014.928, 6146.109, 11449.725, 7992.958, 12.293, 20.849, 
    156.053), `0818702` = list(66.621, 138.772, 346.328, 16698.701, 
    8741.93900000001, 8238.827, 2516.798, 3632.7, 4.212, 6.059, 
    31.708), `0818703` = list(207.539, 153.711, 447.489, 6186.076, 
    8226.877, 10457.782, 1841.649, 1459.469, 9.464, 6.059, 114.956), 
    `0818704` = list(198.159, 144.64, 352.306, 11050.888, 10014.628, 
        13707.412, 2486.78, 1017.094, 8.387, 9.965, 75.717), 
    `0818705` = list(262.511, 128.542, 502.078, 14711.44, 3911.77, 
        4461.576, 4405.838, 1261.304, 9.537, NULL, 138.672), 
    `0818706` = list(169.777, 163.082, 710.92, 12028.523, 2611.744, 
        2222.986, 6597.93000000001, 1841.177, 4.212, NULL, 111.518)), row.names = c("0818402", 
"0818403", "0818404", "0818701", "0818702", "0818703", "0818706", 
"0818707", "08191", "08192", "08194"), class = "data.frame")

您可以使用逻辑值对行和列进行子集化。

inds1 <- rownames(myData) %in% colnames(myData)
inds2 <- colnames(myData) %in% rownames(myData)

myData[inds1, inds2]

#         0818402  0818403  0818404  0818701  0818702  0818703  0818706
#0818402 2428.928 2575.462 8749.347  277.701   66.621  207.539  169.777
#0818403 2596.949 3293.467 12434.01  179.947  138.772  153.711  163.082
#0818404 8982.463 11995.11 36507.17  615.594  346.328  447.489   710.92
#0818701  213.145  239.574  667.364 50675.95  16698.7 6186.076 12028.52
#0818702  160.983  108.902  267.145 17014.93 8741.939 8226.877 2611.744
#0818703  221.232  180.345  396.153 6146.109 8238.827 10457.78 2222.986
#0818706  159.725  186.178  703.365 11449.73 2516.798 1841.649  6597.93

另一种选择是使用intersect从行名和列名中获取公共值。

vals <- intersect(colnames(myData), rownames(myData))
myData[vals, vals]

要将其应用于数据lapply列表,您可以使用lapply / map -

purrr::map(list_df, ~{
  vals <- intersect(colnames(.x), rownames(.x))
  .x[vals, vals]
})
keep = colnames(myData) %in% rownames(myData)
myData[keep, keep]
         0818402  0818403  0818404  0818701  0818702  0818703  0818706
0818404 8982.463 11995.11 36507.17  615.594  346.328  447.489   710.92
0818701  213.145  239.574  667.364 50675.95  16698.7 6186.076 12028.52
0818702  160.983  108.902  267.145 17014.93 8741.939 8226.877 2611.744
0818703  221.232  180.345  396.153 6146.109 8238.827 10457.78 2222.986
0818706  159.725  186.178  703.365 11449.73 2516.798 1841.649  6597.93
0818707   43.183   32.864  102.109 7992.958   3632.7 1459.469 1841.177
08194     40.326   15.903   56.918  156.053   31.708  114.956  111.518

我们也可以用intersect/Reduce做到这一点

nm1 <- Reduce(intersect, dimnames(myData))
myData[nm1, nm1]
         0818402  0818403  0818404  0818701  0818702  0818703  0818706
0818402 2428.928 2575.462 8749.347  277.701   66.621  207.539  169.777
0818403 2596.949 3293.467 12434.01  179.947  138.772  153.711  163.082
0818404 8982.463 11995.11 36507.17  615.594  346.328  447.489   710.92
0818701  213.145  239.574  667.364 50675.95  16698.7 6186.076 12028.52
0818702  160.983  108.902  267.145 17014.93 8741.939 8226.877 2611.744
0818703  221.232  180.345  396.153 6146.109 8238.827 10457.78 2222.986
0818706  159.725  186.178  703.365 11449.73 2516.798 1841.649  6597.93

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM