根据R

时间:2017-11-20 16:20:52

标签: r database dataframe aggregate

我正在清理R中的一些数据,并且有一个这样的数据集:

x1, x2, x3
1, 24, 41
1, 22, 40
1, 21, 38
2, 20, 40
2, 21, 40
3, 22, 41
3, 24, 40
4, 20, 41

我想添加一个新列,每行的值基于x1和x2列。在x1中的每个组中,我想知道x2中的值是否大于或等于24,如果为true,则该组的新列中的所有值都设置为1.

所以数据应如下所示:

x1, x2, x3, x4
1, 24, 41, 1
1, 22, 40, 1
1, 21, 38, 1
2, 20, 40, 0
2, 21, 40, 0
3, 22, 41, 1
3, 24, 40, 1
4, 20, 41, 0

这样做的目的是聚合行。我想基于x1中的组聚合数据,但仍需要其他列的信息。

2 个答案:

答案 0 :(得分:3)

以下是base R

的一个选项
df1$x4 <- table(df1$x1, df1$x2 >=24)[,2][df1$x1]

dplyr

library(dplyr)
df1 %>%
   group_by(x1) %>%
   mutate(x4 = as.integer(any(x2 >=24))) 

答案 1 :(得分:1)

类似于@ akrun的回答,这里是data.table等价物:

library(data.table)

setDT(df)[, x4 := any(x2>=24)*1, by=x1]

<强>结果:

   x1 x2 x3 x4
1:  1 24 41  1
2:  1 22 40  1
3:  1 21 38  1
4:  2 20 40  0
5:  2 21 40  0
6:  3 22 41  1
7:  3 24 40  1
8:  4 20 41  0

数据:

df = structure(list(x1 = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L), x2 = c(24L, 
22L, 21L, 20L, 21L, 22L, 24L, 20L), x3 = c(41L, 40L, 38L, 40L, 
40L, 41L, 40L, 41L)), .Names = c("x1", "x2", "x3"), class = "data.frame", row.names = c(NA, 
-8L))