数据帧按列表进行子集化,而不是识别" NA"值

时间:2017-10-02 06:54:30

标签: r dplyr na

我有以下问题:我从csv导入数据。导入的csv看起来像这样

df <- data.frame(x=c(1,2,3,4,5), y=c("K","M",NA,NA,"K"))

其中K表示1 000和M 1 000 000.我想用dplyr创建一个新列,以便我使用列表来对K和M进行子集并乘以x列中的值

sul <- c("K"=1000, "M"=1000000, "NA"=1)

所以使用dplyr:

df %>% mutate(result=x * sul[y])

我的问题是,在sul[y]中无法识别从csv导入数据导致的结果,我得到NA或NULL。您是否知道如何以优雅的方式解决这个问题?有没有更好的方式运行:

df$y[is.na(df&y)]<-1

非常感谢!

P.S。选择列表子集而不是for-loop来提高处理数据的速度。

1 个答案:

答案 0 :(得分:1)

NA替换为&#39;其他&#39;可能更好。然后做

 sul <- c(K=1000, M=1000000, Other=1)
 df %>%
    mutate(y1 = replace(as.character(y), is.na(y), "Other"),
           result = x*sul[y1]) %>%
    select(-y1)
#  x    y  result
#1 1    K    1000
#2 2    M 2000000
#3 3 <NA>       3
#4 4 <NA>       4
#5 5    K    5000

&#39; NA&#39;在sul中是一个字符串而不是真正的NA。所以,如果我们使用&#39; sul&#39;来自OP的帖子,replace&#39; NA&#39;在&#39; y&#39;到"NA"

df %>%
      mutate(result = x*sul[replace(as.character(y), is.na(y), "NA")])