Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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
使用if语句在R中创建新列_R_Data.table - Fatal编程技术网

使用if语句在R中创建新列

使用if语句在R中创建新列,r,data.table,R,Data.table,对于示例数据帧: df2<- structure(list(region = c("AT22", "AT13", "AT12", "AT11", "AT33", "AT31", "AT21", "AT34", "AT32", "BE21", "BE10", "BE24", "BE31", "BE25", "BE23", "BE32", "BE33", "BE2

对于示例数据帧:

df2<- structure(list(region = c("AT22", "AT13", "AT12", "AT11", "AT33", 
                                "AT31", "AT21", "AT34", "AT32", "BE21", "BE10", "BE24", "BE31", 
                                "BE25", "BE23", "BE32", "BE33", "BE22", "BE34", "BE35"), N = c(241L, 
                                                                                               346L, 306L, 55L, 139L, 311L, 107L, 79L, 119L, 244L, 143L, 146L, 
                                                                                               59L, 212L, 203L, 223L, 173L, 147L, 54L, 75L), freq.1 = c(62L, 
                                                                                                                                                        104L, 64L, 20L, 24L, 78L, 23L, 10L, 20L, 65L, 24L, 29L, 9L, 46L, 
                                                                                                                                                        51L, 74L, 36L, 33L, 14L, 16L), result = c(24.95, 29.97, 21.1, 
                                                                                                                                                                                                  36.27, 18.38, 24.8, 21.28, 12.54, 17.21, 26.64, 16.78, 19.86, 
                                                                                                                                                                                                  15.25, 21.7, 25.12, 33.18, 20.81, 22.45, 25.93, 21.33), level = c(2, 
                                                                                                                                                                                                                                                                    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), delete = c(1, 
                                                                                                                                                                                                                                                                                                                                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("region", 
                                                                                                                                                                                                                                                                                                                                                                                                               "N", "freq.1", "result", "level", "delete"), class = c("data.table", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                      "data.frame"), row.names = c(NA, -20L))
df2=20)1其他0
。。。但它在每一行中放1,第8、13、19和20行实际上应该有0


有什么想法吗?

将逻辑向量转换为二进制的一种快速而简单的方法是使用
+
。这应该是非常快的(但不是一些专家推荐的)

也可以使用
as.integer
进行包装(不太老套,而且速度要快得多)


OP的代码不起作用,因为
if/else
未矢量化。如果我们使用
ifelse

 df2[, delete:= ifelse(N>100|freq.1 >=20, 1, 0)]
ifelse
是一个方便/规范的选项,速度相对较快


注意:OP的示例数据集是一个
数据表。因此,我们使用data.table方法(
:=
)来创建列(它在适当的位置赋值,因此会非常快)。

聪明,将+添加到逻辑中使其为0/1。除了小数字,它们在我看来同样快:@BrandonBertelsen如果我记得过去做过的一些其他基准,
ifelse
落后
df2[, delete:= +(N>=100|freq.1 >=20)]
df2[, delete:= as.integer(N>=100|freq.1 >=20)]
df2
#     region   N freq.1 result level delete
# 1:   AT22 241     62  24.95     2      1
# 2:   AT13 346    104  29.97     2      1
# 3:   AT12 306     64  21.10     2      1
# 4:   AT11  55     20  36.27     2      1
# 5:   AT33 139     24  18.38     2      1
# 6:   AT31 311     78  24.80     2      1
# 7:   AT21 107     23  21.28     2      1
# 8:   AT34  79     10  12.54     2      0
# 9:   AT32 119     20  17.21     2      1
#10:   BE21 244     65  26.64     2      1
#11:   BE10 143     24  16.78     2      1
#12:   BE24 146     29  19.86     2      1
#13:   BE31  59      9  15.25     2      0
#14:   BE25 212     46  21.70     2      1
#15:   BE23 203     51  25.12     2      1
#16:   BE32 223     74  33.18     2      1
#17:   BE33 173     36  20.81     2      1
#18:   BE22 147     33  22.45     2      1
#19:   BE34  54     14  25.93     2      0
#20:   BE35  75     16  21.33     2      0
 df2[, delete:= ifelse(N>100|freq.1 >=20, 1, 0)]