【问题标题】:Why can't I substitute a value in a merged dataframe?为什么我不能替换合并数据框中的值?
【发布时间】:2018-10-24 05:34:15
【问题描述】:

我有两个dataframes如下:

df1 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
C   no  D
D   no  A
E   yes F
F   yes G
G   no  E", header = T)

df2 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
E   yes F
F   yes G", header = T)

我将df1df2 合并:interactions &lt;- merge(df1, df2) 然后我尝试将match 每个SourceTargetdf3 合并。

df3 <- read.table(text = "Symbol    ID  Name
A   11  LetterA
C   13  LetterC
D   14  LetterD
F   16  LetterF
G   17  LetterG", header = T)

我得到以下输出:

Source
     Symbol   ID    Name
1         A   11    LetterA
NA     <NA>   NA    <NA>
NA.1   <NA>   NA    <NA>
4         F   16    LetterF

所以我想replaceNAdf2 中显示的“原始”输入并获得如下输出:

Symbol  ID   Name
  A     11   LetterA
  B     NA   B
  E     NA   E
  F     16   LetterF

我试过了:

Source <- df3[match(interactions$Source, df3$Symbol),-4]
my.na <- is.na(Source$Name)
Source$Name[my.na] <- interactions$Source[my.na]
Source$Symbol[my.na] <- interactions$Source[my.na]

但我得到的是数字而不是字符。有什么我想念的吗? 是否可以在不使用任何库的情况下替换合并值?

【问题讨论】:

    标签: r class dataframe types merge


    【解决方案1】:

    您的问题是,默认情况下,read.table 将字符串转换为存储为整数的因子,这些因子映射到查找表。因此,当您尝试将它们插入Source 时,它实际插入的是该因子的整数值。您可以通过在您的read.table 调用中添加参数:stringsAsFactors = F 来解决此问题,以便将那里的数据保存为字符串。现在,当您使用 match 将值插入 Source 时,它将插入字符串,而不是因子数字。

    如果您仍然遇到问题,您可能还需要将Source 中的变量转换为字符而不是因子。你可以这样做:

    # Base R:
    Source$Symbol <- as.character(Source$Symbol)
    Source$Name <- as.character(Source$Name)
    
    # Dplyr:
    library(dplyr)
    Source <- Source %>%
        mutate_if(is.factor, as.character)
    

    【讨论】:

    • 应用了您的解决方案,这正是我所需要的。非常感谢!!
    • 没问题!我浪费了很多时间来处理不需要的字符串 因子转换,所以我很乐意提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2016-03-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多