使用if语句的R中的新列

时间:2016-02-02 16:02:24

标签: 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", "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))

我想创建一个名为'delete'的变量,它突出显示哪个观察值'N'大于或等于100或'freg.1'大于或等于20.目前,我使用以下代码:

df$delete <- if (df$N >=100 | df$freq.1>=20) 1 else 0

...但是每行放1个 - 第8,13,19和20行实际上应该为0。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

+

也可以通过df2[, delete:= +(N>=100|freq.1 >=20)] 换行(不是hacky,而且速度更快)。

as.integer

由于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 没有矢量化,因此OP的代码没有成功。如果我们使用if/else

,它会起作用
ifelse

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

注意:OP的示例数据集是ifelse。因此,我们使用data.table方法(data.table)来创建列(它正在分配,因此速度非常快)。