努力想把事情做好希望有人能帮忙...
我有一个数据集,在这个数据集中,我试图让row_max成为A:N列之间的最大值,row_min应该是第二大值(不是零)。
我尝试了以下方法来获取row_max:
tmp$row_max = colnames(tmp[,5:9])[apply(tmp[,5:9],1,which.max)]
which.min
返回包含0的列
contig pos ref cov A T C G N row_max
1: NW_017095466.1 130 N 41 39 2 0 0 0 A
2: NW_017095466.1 166 N 48 0 46 2 0 0 T
3: NW_017095466.1 427 N 52 50 0 0 2 0 A
4: NW_017095466.1 1736 N 54 44 0 10 0 0 A
5: NW_017095466.1 1918 N 46 0 0 3 43 0 G
6: NW_017095466.1 2688 N 52 5 0 47 0 0 C
我可以对列进行排序,然后选择第二高的列,但这会给我值,很难得到要返回的column_name:
apply(tmp[,5:9], 1, FUN = function(x) sort(x)[4])
有没有一个简洁的tidyverse解决方案?
dput(tmp)
structure(list(contig = c("NW_017095466.1", "NW_017095466.1",
"NW_017095466.1", "NW_017095466.1", "NW_017095466.1", "NW_017095466.1"
), pos = c(130L, 166L, 427L, 1736L, 1918L, 2688L), ref = c("N",
"N", "N", "N", "N", "N"), cov = c(41L, 48L, 52L, 54L, 46L, 52L
), A = c(39L, 0L, 50L, 44L, 0L, 5L), T = c(2L, 46L, 0L, 0L, 0L,
0L), C = c(0L, 2L, 0L, 10L, 3L, 47L), G = c(0L, 0L, 2L, 0L, 43L,
0L), N = c(0L, 0L, 0L, 0L, 0L, 0L), row_max = c("A", "T", "A",
"A", "G", "C"), row_min = c("C", "A", "T", "T", "A", "T")), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7f94c30168e0>)
4条答案
按热度按时间iyr7buue1#
使用
order()
可以很容易地做到这一点,如果元素被排序,它会给予你元素的位置,使用它以正确的顺序选择名称,你会得到一个按元素大小排序的名称矩阵。s4n0splo2#
这里有一种排除
min
部分的0
的方法。还要记住,如果数据混合了numeric
和character
,则apply
会转换为character
,因此显式转换为数值可以避免奇数空格。使用
dplyr
数据
zpqajqem3#
下面是另一个解决方案:
aurhwmvo4#
由于您示例数据集似乎是
data.table
,因此这里使用了data.table方法