【问题标题】:Paste one column to another with NA conditional使用 NA 条件将一列粘贴到另一列
【发布时间】:2016-04-20 02:11:36
【问题描述】:

我想将col3 粘贴到col1,但要避免col1 中的NAs

我的意见:

df <- "col1 col2 col3
       100   x   102
       105   x   106
       101   x   NA"
df <- read.table(text=df, header=T)

我的预期输出:

dfout <- "col1 col2 col3
       102   x   102
       106   x   106
       101   x   NA"
dfout <- read.table(text=dfout, header=T)

有什么想法吗?

【问题讨论】:

  • df$col1[!is.na(df$col3)] &lt;- na.omit(df$col3)?
  • @user2120870 你的dfout 正确吗?您说您希望将col3 粘贴到col1,但dfout 并非如此
  • 对不起@steveb,我看不出是错误。我在 dfout 中看到的这两个列之间的唯一区别是 NA,它没有被粘贴(实际上是我原来的问题)。
  • @user2120870 我看错了你的问题,所以我认为这已经完成了

标签: r conditional paste na


【解决方案1】:

听上去,像下面这样的东西应该符合你的描述:

df$col1[!is.na(df$col3)] <- na.omit(df$col3)

或者,但遵循相同的概念,将是:

df$col1 <- replace(df$col1, !is.na(df$col3), na.omit(df$col3))

【讨论】:

  • 另一个变体是transform(df, col1 = ifelse(is.na(col3), col1, col3))
【解决方案2】:

我们还可以使用data.table 并在适当的位置分配(:=),这样效率会更高。

library(data.table)
setDT(df)[!is.na(col3), col1:= col3]
df
#  col1 col2 col3
#1:  102    x  102
#2:  106    x  106
#3:  101    x   NA

【讨论】:

    【解决方案3】:

    你可以使用ifelse():

    df$col1 <- ifelse(is.na(df$col3), df$col1, df$col3)
    

    这也可以和dplyr一起使用:

    library(dplyr)
    df <- mutate(df, col1 = ifelse(is.na(col3), col1, col3))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2023-03-07
      • 2014-03-25
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多