我有一些数据,看起来像:
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
/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