Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table仅在某些条件下更改列_R_Data.table - Fatal编程技术网

R data.table仅在某些条件下更改列

R data.table仅在某些条件下更改列,r,data.table,R,Data.table,我有一个data.table,在特定条件下,我想在其中更改一些列 tmp = data.table(id = rep(LETTERS[1:4], each = 3), flag = c(NA, NA, 4, NA, 5, 4, NA, NA, NA, 7, 5, 6)) > tmp id flag 1: A NA 2: A NA 3: A 4 4: B NA 5: B 5 6: B 5 7: C NA 8: C

我有一个data.table,在特定条件下,我想在其中更改一些列

tmp = data.table(id = rep(LETTERS[1:4], each = 3), flag = c(NA, NA, 4, NA, 5, 4, NA, NA, NA, 7, 5, 6))

> tmp
    id flag
 1:  A   NA
 2:  A   NA
 3:  A    4
 4:  B   NA
 5:  B    5
 6:  B    5
 7:  C   NA
 8:  C   NA
 9:  C   NA
10:  D    7
11:  D    5
12:  D    6
我想要的是,如果标识列中的所有值都是NA,那么我想要值为5,如果只有一些是NA,那么我想要值为min,如果没有一个是NA,我想要返回原始值

我写了几个ifelse语句来实现这一点,但我发现如果标志中没有NAs,我通过该值返回标志,它将返回它看到的第一个值

tmp[ , "flag2" := ifelse(all(is.na(flag)), 5, ifelse(any(is.na(flag)), min(flag, na.rm = TRUE), flag)), by = .(id)]

> tmp
    id flag flag2
 1:  A   NA     4
 2:  A   NA     4
 3:  A    4     4
 4:  B   NA     5
 5:  B    5     5
 6:  B    5     5
 7:  C   NA     5
 8:  C   NA     5
 9:  C   NA     5
10:  D    7     7
11:  D    5     7
12:  D    6     7
为什么这不返回D的原始序列7 5 6?还有,有没有一种简单的方法来纠正这个问题?

any(…)
返回一个逻辑值而不是一个逻辑向量,因此结果取
标志的第一个元素,如下所示:

ifelse(FALSE, 3, c(2,3))
# [1] 2
在您的情况下,您不需要矢量化的
ifelse
if/else
应该可以工作:

tmp[ , "flag2" := if(all(is.na(flag))) 5 else if(any(is.na(flag))) min(flag, na.rm = TRUE) else flag, by = .(id)]

tmp
#    id flag flag2
# 1:  A   NA     4
# 2:  A   NA     4
# 3:  A    4     4
# 4:  B   NA     4
# 5:  B    5     4
# 6:  B    4     4
# 7:  C   NA     5
# 8:  C   NA     5
# 9:  C   NA     5
#10:  D    7     7
#11:  D    5     5
#12:  D    6     6