我有以下问题:

test <- data.table(v = ceiling(runif(20, 0, 5)), g = ceiling(runif(20, 0, 2)))
setorder(test, g)

test[, (paste0("n", 1:5)) := lapply(1:5, function(x) sum(v == x)), by = g]

test[, (paste0("foo", 1:3)) := lapply(1:3, function(x){ifelse(get(paste0("n", x + 1)) != 0,
                                                       get(paste0("n", x))/get(paste0("n", x + 1)), NA)}), by = g]

test

如果您多次运行这段代码,那么不时会有一个"foo"变量被转换为逻辑变量,这毫无意义.

谢谢你的帮助!

推荐答案

原因是默认情况下使用NA,它是NA_logical_,如果根据条件只有NA,那么它将是一个逻辑列,否则它将被强制为其他观察的列类型.如果我们使用?NA中提到的NA_real_常数,就可以解决这个问题

NA是长度为1的逻辑常数,其中包含缺失的值指示符.NA可以强制为除raw之外的任何其他向量类型.还有其他支持缺失值的原子向量类型的常数NA_integer_uu、NA_real_u、NA_complex_u和NA_character_u:所有这些都是R语言中的保留字.

test[, (paste0("foo", 1:3)) := 
   lapply(1:3, function(x){
    ifelse(get(paste0("n", x + 1)) != 0,                                          
       get(paste0("n", x))/get(paste0("n", x + 1)), NA_real_)}), by = g]

与使用ifelse并根据列类型指定正确的NA不同,还有一个选项是使用case_when(从dplyr开始)或data.table::fcase,默认情况下返回NA(具有适当的列类型)

test[, paste0("foo", 1:3) := lapply(1:3, 
  function(x) fcase(.SD[[paste0("n", x + 1)]] !=0, 
   .SD[[paste0("n", x)]]/.SD[[paste0("n", x + 1)]])), by = g]

-测试

lst1 <- replicate(10, {
  test <- data.table(v = ceiling(runif(20, 0, 5)),
     g = ceiling(runif(20, 0, 2)))
  setorder(test, g)
test[, (paste0("n", 1:5)) := lapply(1:5, function(x) sum(v == x)),
   by = g];test[, paste0("foo", 1:3) := lapply(1:3, 
  function(x) fcase(.SD[[paste0("n", x + 1)]] !=0, 
   .SD[[paste0("n", x)]]/.SD[[paste0("n", x + 1)]])), by = g]
}, simplify = FALSE)

-用NA判断一个元素

> lst1[[9]]
        v     g    n1    n2    n3    n4    n5  foo1  foo2  foo3
    <num> <num> <int> <int> <int> <int> <int> <num> <num> <num>
 1:     4     1     3     1     0     2     4  3.00    NA     0
 2:     5     1     3     1     0     2     4  3.00    NA     0
 3:     1     1     3     1     0     2     4  3.00    NA     0
 4:     4     1     3     1     0     2     4  3.00    NA     0
 5:     5     1     3     1     0     2     4  3.00    NA     0
 6:     1     1     3     1     0     2     4  3.00    NA     0
 7:     5     1     3     1     0     2     4  3.00    NA     0
 8:     2     1     3     1     0     2     4  3.00    NA     0
 9:     1     1     3     1     0     2     4  3.00    NA     0
10:     5     1     3     1     0     2     4  3.00    NA     0
11:     2     2     1     4     0     1     4  0.25    NA     0
12:     1     2     1     4     0     1     4  0.25    NA     0
13:     2     2     1     4     0     1     4  0.25    NA     0
14:     5     2     1     4     0     1     4  0.25    NA     0
15:     5     2     1     4     0     1     4  0.25    NA     0
16:     2     2     1     4     0     1     4  0.25    NA     0
17:     5     2     1     4     0     1     4  0.25    NA     0
18:     4     2     1     4     0     1     4  0.25    NA     0
19:     2     2     1     4     0     1     4  0.25    NA     0
20:     5     2     1     4     0     1     4  0.25    NA     0
        v     g    n1    n2    n3    n4    n5  foo1  foo2  foo3

R相关问答推荐

R图中的字体大小和字体样式(带有R底图)

图片中令人惊讶的行为

将R data.frame转换为json数组(源代码)

使用gsim删除特殊词

在R中使用自定义函数时如何删除该函数的一部分?

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

如何使用按钮切换轨迹?

如何在emmeans中计算连续变量的对比度

使用tidy—select创建一个新的带有mutate的摘要变量

如何得到每四个元素向量R?

将小数分隔符放在R中的前两位数字之后

将饼图插入条形图

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

如何将Which()函数用于管道%>;%

如何移除GGPlot中超出与面相交的任何格网像元

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

将统计检验添加到GGPUBR中的盒图,在R

数值型数据与字符混合时如何进行绑定

避免在图例中显示VLINS组