我有以下问题:我从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来提高处理数据的速度。
答案 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")])