下面是另一种基本R方式:
matched_sum <- function(dfr){
matched_col <- function(col_id) {
col_pattern <- gsub("[0-9]", "", colnames(dfr[col_id]))
dfr[grepl(col_pattern, rownames(x)),col_id] <- NA
return(dfr[col_id])
}
new_col <- lapply(1:ncol(dfr), matched_col)
new_dfr <- do.call(cbind.data.frame, new_col)
colSums(new_dfr, na.rm = TRUE)
}
# Your data frame. You can use as.data.frame(x) in case x is not a data frame
x
AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
AUS1 1 7 13 19 25 31
AUS2 2 8 14 20 26 32
AUS3 3 9 15 21 27 33
AUT1 4 10 16 22 28 34
AUT2 5 11 17 23 29 35
AUT3 6 12 18 24 30 36
# Apply the function to x
matched_sum(x)
AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
15 33 51 60 78 96
函数的作用
col_pattern <- gsub("[0-9]", "", colnames(dfr[col_id]))
在每个列名中查找模式.模式是数字以外的任何字符串.例如:"AUS1"中的模式是"AUS".
dfr[grepl(col_pattern, rownames(x)),col_id] <- NA
将NA分配给列中具有在第一步中找到的模式的任何行.例如,此步骤后的第一列将变为:
AUS1
AUS1 NA
AUS2 NA
AUS3 NA
AUT1 4
AUT2 5
AUT3 6
lapply(1:ncol(dfr), matched_col)
将第一步和第二步应用于数据框中的每一列.
do.call(cbind.data.frame, new_col)
将所有列(所选行中已包含NA)绑定到数据帧.例如,如果您提供的输入为x
,则在此步骤之后,它将变为:
AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
AUS1 NA NA NA 19 25 31
AUS2 NA NA NA 20 26 32
AUS3 NA NA NA 21 27 33
AUT1 4 10 16 NA NA NA
AUT2 5 11 17 NA NA NA
AUT3 6 12 18 NA NA NA
colSums(new_dfr, na.rm = TRUE)
对第4步中创建的数据帧中每列中的所有非NA值求和.
如果要保留数据的矩阵 struct ,可以使用以下方法:
matched_sum_mat <- function(mat){
matched_col <- function(col_id) {
col_pattern <- gsub("[0-9]", "", dimnames(mat)[[2]][col_id])
mat[grepl(col_pattern, dimnames(mat)[[1]]),col_id] <- NA
return(mat[,col_id])
}
new_col <- lapply(1:ncol(mat), matched_col)
new_mat <- do.call(cbind, new_col)
colnames(new_mat) <- colnames(mat)
colSums(new_mat, na.rm = TRUE)
}
# Apply to x as a matrix
matched_sum_mat(x)
AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
15 33 51 60 78 96
更新
如果您希望列名和行名之间的值为exact match,例如列名中的"AUS1"和行名中的"AUS1"(而不是"AUS")之间的值,则可以通过以下几种方式获得该值:
# Option 1
matched_name_location <- lapply(
colnames(x),
function(a_col_name) rownames(x) %in% a_col_name) |>
unlist() |>
which()
x[matched_name_location] <- NA
# The result
AUS1 AUS2 AUS3 AUT1 AUT2 AUT3
AUS1 NA 7 13 19 25 31
AUS2 2 NA 14 20 26 32
AUS3 3 9 NA 21 27 33
AUT1 4 10 16 NA 28 34
AUT2 5 11 17 23 NA 35
AUT3 6 12 18 24 30 NA
另一种 Select 是使用==
而不是%in%
:
# Option 2
matched_name_location <- lapply(
colnames(x),
function(a_col_name) rownames(x) == a_col_name) |>
unlist() |>
which()
x[matched_name_location] <- NA
另一种 Select 是使用grepl
.
# Option 3
matched_name_location <- lapply(
colnames(x),
function(a_col_name) grepl(a_col_name, rownames(x))) |>
unlist() |>
which()
x[matched_name_location] <- NA
最后一个用于查找模式within a字符串.例如,它grepl("AUS1", "AUS10")
返回TRUE
,而"AUS1" %in% "AUS10"
和"AUS1" == "AUS10"
中的每一个都返回FALSE
.