基于逻辑运算符和相同匹配 ID 的粘贴列表
paste list based on a logical operator combined with identical matching IDs
我是 R 的新手,我会尽力解释我的问题。
我在一个数据框中工作,其中有 15571 个 obs 和 18976 个变量。 colnames 和 rownames 是基因名,其中大部分具有相同的名称匹配。这些条目仅包含数值并且是相关值。这是它的样子。
[GENE128] [GENE271] [GENE2983]
[GENE231] 0.71 0.98 0.32
[GENE128] 0.23 0.61 0.90
[GENE271] 0.87 0.95 0.63
我想做的是编写一个代码,在其中我使用逻辑运算符 x > 0.8 粘贴一个列表,其中包含 df 中的所有基因,并且仅粘贴基因名(列名和行名)所在的基因与上面的示例相同,在这种情况下,只有 "GENE271" 会是 "TRUE"。
有办法吗?
我相信有人有更好、更快的方法。这种方式会很慢,但应该可行....
test <- data.frame(GENE128 = c(0.71,0.23,0.87), GENE271 = c(0.98,0.61,0.95),
GENE2983 = c(0.32,0.90,0.63))
row.names(test) <- c('GENE231', 'GENE128', 'GENE271')
gene.equal <- function(x, limit = 0.8){
df <- c()
for(i in 1:nrow(x)){
row <- x[i,]
indexes <- which(row.names(row) == colnames(x))
if(length(indexes) > 0 && row[,indexes] > limit){
row[,indexes] <- 'TRUE'
}
df <- rbind(df, row)
}
df
}
new.df <- gene.equal(x = test)
我将 'TRUE'
设为文本,否则如果您使用 TRUE
(无引号),它会将其转换为“1.00”。
您的示例数据作为数据框
vec = c( 0.71,0.98,0.32,0.23,0.61,0.90,0.87,0.95,0.63)
mt = matrix(vec, 3, 3, byrow = T)
coln = c('GENE128', 'GENE271', 'GENE2983')
rown = c('GENE231', 'GENE128', 'GENE271')
df = data.frame(mt)
colnames(df) = coln
rownames(df) = rown
使用行名和列名构建新数据框并对值进行矢量化
ndf = data.frame(coln = as.vector(sapply(coln, function(x) rep(x, ncol(df)))), rown = rep(rown, ncol(df)), data = as.vector(as.matrix(df)), stringsAsFactors = F)
idx_true = sapply(1:nrow(ndf), function(x) ndf[x, 1] == ndf[x, 2])
subs_ndf = ndf[idx_true, ]
subs_ndf[which(ndf[idx_true, 'data'] > 0.8 ), ]
输出
coln rown data
6 GENE271 GENE271 0.95
以下语句分两步提供所需结果(df
是您的数据框)。
> df <- df[which(row.names(df) %in% colnames(df) & df >= 0.8),]
> df
GENE128 GENE271 GENE2983
GENE271 0.87 0.95 0.63
NA NA NA NA
NA.1 NA NA NA
> na.omit(df)
GENE128 GENE271 GENE2983
GENE271 0.87 0.95 0.63
我必须使用 na.omit(df)
来摆脱那些 NA
,但解决方案提供了准确的数据,无需 运行 复杂的代码。
我是 R 的新手,我会尽力解释我的问题。
我在一个数据框中工作,其中有 15571 个 obs 和 18976 个变量。 colnames 和 rownames 是基因名,其中大部分具有相同的名称匹配。这些条目仅包含数值并且是相关值。这是它的样子。
[GENE128] [GENE271] [GENE2983]
[GENE231] 0.71 0.98 0.32
[GENE128] 0.23 0.61 0.90
[GENE271] 0.87 0.95 0.63
我想做的是编写一个代码,在其中我使用逻辑运算符 x > 0.8 粘贴一个列表,其中包含 df 中的所有基因,并且仅粘贴基因名(列名和行名)所在的基因与上面的示例相同,在这种情况下,只有 "GENE271" 会是 "TRUE"。
有办法吗?
我相信有人有更好、更快的方法。这种方式会很慢,但应该可行....
test <- data.frame(GENE128 = c(0.71,0.23,0.87), GENE271 = c(0.98,0.61,0.95),
GENE2983 = c(0.32,0.90,0.63))
row.names(test) <- c('GENE231', 'GENE128', 'GENE271')
gene.equal <- function(x, limit = 0.8){
df <- c()
for(i in 1:nrow(x)){
row <- x[i,]
indexes <- which(row.names(row) == colnames(x))
if(length(indexes) > 0 && row[,indexes] > limit){
row[,indexes] <- 'TRUE'
}
df <- rbind(df, row)
}
df
}
new.df <- gene.equal(x = test)
我将 'TRUE'
设为文本,否则如果您使用 TRUE
(无引号),它会将其转换为“1.00”。
您的示例数据作为数据框
vec = c( 0.71,0.98,0.32,0.23,0.61,0.90,0.87,0.95,0.63)
mt = matrix(vec, 3, 3, byrow = T)
coln = c('GENE128', 'GENE271', 'GENE2983')
rown = c('GENE231', 'GENE128', 'GENE271')
df = data.frame(mt)
colnames(df) = coln
rownames(df) = rown
使用行名和列名构建新数据框并对值进行矢量化
ndf = data.frame(coln = as.vector(sapply(coln, function(x) rep(x, ncol(df)))), rown = rep(rown, ncol(df)), data = as.vector(as.matrix(df)), stringsAsFactors = F)
idx_true = sapply(1:nrow(ndf), function(x) ndf[x, 1] == ndf[x, 2])
subs_ndf = ndf[idx_true, ]
subs_ndf[which(ndf[idx_true, 'data'] > 0.8 ), ]
输出
coln rown data
6 GENE271 GENE271 0.95
以下语句分两步提供所需结果(df
是您的数据框)。
> df <- df[which(row.names(df) %in% colnames(df) & df >= 0.8),]
> df
GENE128 GENE271 GENE2983
GENE271 0.87 0.95 0.63
NA NA NA NA
NA.1 NA NA NA
> na.omit(df)
GENE128 GENE271 GENE2983
GENE271 0.87 0.95 0.63
我必须使用 na.omit(df)
来摆脱那些 NA
,但解决方案提供了准确的数据,无需 运行 复杂的代码。