我正在尝试学习R,我有一个包含68个连续和分类变量的数据框。有两个变量 - > x和lnx,我需要帮助。对应大量的0& s& NA中的NA,lnx表示NA。现在,我想编写一个代码,通过该代码,我可以使用log(x + 1)来将lnx中的NA替换为0,其中对应的x也是0(如果x == 0,那么我想要只有lnx == 0,如果x == NA,我想要lnx == NA)。数据框看起来像这样 -
a b c d e f x lnx
AB1001 1.00 3.00 67.00 13.90 2.63 1776.7 7.48
AB1002 0.00 2.00 72.00 38.70 3.66 0.00 NA
AB1003 1.00 3.00 48.00 4.15 1.42 1917 7.56
AB1004 0.00 1.00 70.00 34.80 3.55 NA NA
AB1005 1.00 1.00 34.00 3.45 1.24 3165.45 8.06
AB1006 1.00 1.00 14.00 7.30 1.99 NA NA
AB1007 0.00 3.00 53.00 11.20 2.42 0.00 NA
我尝试编写以下代码 -
data.frame$lnx[is.na(data.frame$lnx)] <- log(data.frame$x +1)
但是我收到以下警告消息并且输出错误:
要更换的项目数量不是更换长度的倍数。有人可以指导我。
感谢。
答案 0 :(得分:1)
在R中,您可以使用条件选择行并直接指定值。在您的示例中,您可以执行此操作:
df[is.na(df$lnx) & df$x == 0,'lnx'] <- 0
这就是它的作用:
is.na(df$lnx)
返回df$lnx
长度的逻辑向量,告知每行lnx是否为NA
。 df$x == 0
执行相同的操作,检查每行x == 0
是否为&
。通过使用TRUE
运算符,我们将这些向量组合为仅包含TRUE
的向量,仅适用于条件均为lnx
的行。
然后,我们使用括号表示法在TRUE
中选择df
这两个条件为<-
的行的log(data.frame$x +1)
列,然后使用{{1}将值0插入这些单元格中}
您获得的具体错误是因为df$lnx[is.na(df$lnx)]
和log(data.frame$x +1)
的长度不同。 df$lnx[is.na(df$lnx)]
生成一个向量,其长度是数据框的行数,而NA
的长度是lnx
中Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/2.3.0/gems/json-2.1.0/ext/json/ext/generator
/usr/bin/ruby2.3 -r ./siteconf20180320-1003-beh1w0.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /var/lib/gems/2.3.0/gems/json-2.1.0 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/json-2.1.0/gem_make.out
的行数
答案 1 :(得分:0)
使用dplyr
解决方案:
library(dplyr)
df %>%
mutate(lnx = case_when(
x == 0.0 ~ 0,
is.na(x) ~ NA_real_))
这样可以得到你的例子:
# A tibble: 7 x 8
a b c d e f x lnx
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AB1001 1. 3. 67. 13.9 2.63 1777. NA
2 AB1002 0. 2. 72. 38.7 3.66 0. 0.
3 AB1003 1. 3. 48. 4.15 1.42 1917. NA
4 AB1004 0. 1. 70. 34.8 3.55 NA NA
5 AB1005 1. 1. 34. 3.45 1.24 3165. NA
6 AB1006 1. 1. 14. 7.30 1.99 NA NA
7 AB1007 0. 3. 53. 11.2 2.42 0. 0.