我在 R 中有一个相对简单的问题,我似乎无法弄清楚。我有两个具有完全相同尺寸的数据框:
#dataframe 1
df1 = data.frame("contrast1" = c('2.3', '6.5', '0.6', '-0.8', '2.3', '2.4', '-7.1'),
"contrast2" = c('1.0','0.9','0.8','2.3','4.3','8.7','0.4'),
"contrast3" = c('-0.2','-0.1','-1.2','-2.3','-0.3','-0.4','-0.1'))
row.names(df1) = c('gene1','gene2','gene3','gene4','gene5','gene6','gene7')
#dataframe 2
df2 = data.frame("contrast1" = c('1', '1', '0', '0', '1', '1', '1'),
"contrast2" = c('1','0','0','1','1','1','0'),
"contrast3" = c('0','0','1','1','0','0','0'))
row.names(df2) = c('gene1','gene2','gene3','gene4','gene5','gene6','gene7')
数据框如下所示:
>df1
contrast1 contrast2 contrast3
gene1 2.3 1.0 -0.2
gene2 6.5 0.9 -0.1
gene3 0.6 0.8 -1.2
gene4 -0.8 2.3 -2.3
gene5 2.3 4.3 -0.3
gene6 2.4 8.7 -0.4
gene7 -7.1 0.4 -0.1
>df2
contrast1 contrast2 contrast3
gene1 1 1 0
gene2 1 0 0
gene3 0 0 1
gene4 0 1 1
gene5 1 1 0
gene6 1 1 0
gene7 1 0 0
现在,我想根据 df2 中的值替换 df1 中的某些值。具体来说,每当 df2 中的值为零时,我希望将 df1 的每一列中的相应字段替换为“NA”。
生成的数据框应如下所示:
>df_output
contrast1 contrast2 contrast3
gene1 2.3 1.0 NA
gene2 6.5 NA NA
gene3 NA NA -1.2
gene4 NA 2.3 -2.3
gene5 2.3 4.3 NA
gene6 2.4 8.7 NA
gene7 -7.1 NA NA
确实有很多类似的问题 - here , here和 here例如 - 但他们似乎都没有做我正在寻找的事情。我尝试了一些方法但没有成功。下面的代码使用 dplyr,是我得到的最接近的代码 - 但它向我抛出错误消息,并且尚未考虑到我实际上想用“NA”而不是零替换值。
library(dplyr)
df2 %>%
left_join(df1, by = rownames(df1)) %>%
mutate(Count = ifelse(is.zero(Count.x), Count.y, Count.x)) %>%
select(-c(Count.x, Count.y))
最佳答案
在 base R
,转换 type
来自 character
的“df1”列数至numeric
与 type.convert
,然后进行算术运算将值更改为 NA
df1 <- type.convert(df1, as.is = TRUE)
(NA^(df2 == 0)) * df1
-输出
# contrast1 contrast2 contrast3
#gene1 2.3 1.0 NA
#gene2 6.5 NA NA
#gene3 NA NA -1.2
#gene4 NA 2.3 -2.3
#gene5 2.3 4.3 NA
#gene6 2.4 8.7 NA
#gene7 -7.1 NA NA
与 tidyverse
,我们可以使用map2
library(purrr)
map2_dfc(df1, df2, ~ replace(.x, .y == 0, NA))
关于R:使用条件,根据数据帧 Y 中的值替换数据帧 X 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64359921/