R:使用条件,根据数据帧 Y 中的值替换数据帧 X 中的值

标签 r dataframe dplyr conditional-statements

我在 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 , herehere例如 - 但他们似乎都没有做我正在寻找的事情。我尝试了一些方法但没有成功。下面的代码使用 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”列数至numerictype.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/

相关文章:

r - 运行 Xgboost 时出错

python - 在 pandas 数据框中查找元素

r - R中数据之间的链接

r - dplyr:根据聚合函数结果过滤行

r - 在具有不同 nrows 的组内随机抽取 n 个样本

r - dplyr 变异 : Excluding observations similar to the current one

r - 减去具有数字数据的列的行方法

html - 链接到 Shiny 应用程序的选项卡或面板

r - R中的类内相关系数,如何处理NA以及评分者和受试者之间没有太多重叠

python - 为什么 Pandas DataFrame 切片的索引与其形状不同?