R中的聚合函数,多个条件
aggregate function in R, multiple conditions
我没有通过 grep 函数聚合另一列来计算包含数据框中一列总和的新列的正确方法。数据框如下所示:
ID_Oeffnungszeit ID_Einrichtung Anzahl_Std Bez_Oeffnungszeit
1 3000001 0.50 Montag Vormittag
1 3000003 3.00 Montag Vormittag
1 3000008 2.50 Montag Vormittag
2 3000001 1.00 Montag Nachmittag
4 3000003 1.50 Dienstag Vormittag
1 3000023 1.00 Montag Vormittag
1 3000025 1.00 Montag Vormittag
1 3000026 1.00 Montag Vormittag
3 3000001 2.00 Montag Abend
...
1 3000038 3.50 Montag Vormittag
and so on...
变量Bez_Oeffnungszeit
有21个特征,但如果其中包含Vormittag
、Nachmittag
或Abend
等词,则可以归为一类。
所以我想生成一个新列,其中包含每个 ID_Einrichtung
列 Anzahl_Std
的总和,具体取决于 Bez_Oeffnungszeit
包含的单词。
我很确定我应该使用 grep
和 by
函数,但我无法让它在我的意义上发挥作用...
df <- structure(list(ID_Oeffnungszeit = c("1", "1", "1", "2", "4",
"1", "1", "1", "3"), ID_Einrichtung = c(3000001L, 3000003L, 3000008L,
3000001L, 3000003L, 3000023L, 3000025L, 3000026L, 3000001L),
Anzahl_Std = c(0.5, 3, 2.5, 1, 1.5, 1, 1, 1, 2), Bez_Oeffnungszeit = c("Montag Vormittag",
"Montag Vormittag", "Montag Vormittag", "Montag Nachmittag",
"Dienstag Vormittag", "Montag Vormittag", "Montag Vormittag",
"Montag Vormittag", "Montag Abend")), .Names = c("ID_Oeffnungszeit",
"ID_Einrichtung", "Anzahl_Std", "Bez_Oeffnungszeit"), class = "data.frame", row.names = c(NA,
-9L))
我认为最简单的方法是创建一个仅包含单词 "Vormittag"、"Nachmittag" 或 "Abend" 的新列,然后将其用作分组变量。
例如:
# Set random seed for reproducibility
set.seed(12345)
# Make some data
my.data <- data.frame(ID_Oeffnungszeit = sample(1:10, 100, replace = TRUE),
ID_Einrichtung = sample(3000001:3000020, 100, replace = TRUE),
Anzahl_Std = rnorm(100),
Bez_Oeffnungszeit = sample(c("Montag Vormittag",
"Montag Nachmittag",
"Dienstag Vormittag",
"Montag Abend"), 100,
replace = T))
# Create a new column containing "Vormittag", "Nachmittag" or "Abend"
my.data$cat <- ""
my.data$cat[grep("Vormittag", my.data$Bez_Oeffnungszeit)] <- "Vormittag"
my.data$cat[grep("Nachmittag", my.data$Bez_Oeffnungszeit)] <- "Nachmittag"
my.data$cat[grep("Abend", my.data$Bez_Oeffnungszeit)] <- "Abend"
# Now just call aggregate over the Std variable using ID and category
# as grouping factors.
res <- aggregate(my.data$Anzahl_Std,
by = list(ID = my.data$ID_Einrichtung, cat = my.data$cat),
FUN = sum)
这里还有一个选项(使用问题中提到的数据)
library(splitstackshape)
第 1 步: 使用 splitstackshape 的 cSplit
函数利用 space 以 wide
格式拆分列 Bez_Oeffnungszeit
两个字之间。
这将生成包含第一个单词的两列 'Bez_Oeffnungszeit_1'
和包含第二个单词的 'Bez_Oeffnungszeit_2'
,第二个单词将在第二步中进一步使用
dt = cSplit(df, 'Bez_Oeffnungszeit', ' ', 'wide')
第 2 步: 我们使用 'Bez_Oeffnungszeit_2'
包含感兴趣的词和 'ID_Einrichtung'
列对 'Anzahl_Std'
使用 data.table
求和语法
dt[order(Bez_Oeffnungszeit_2), .(New = sum(Anzahl_Std)),
by = .(ID_Einrichtung, Bez_Oeffnungszeit_2)]
#output looks like:
# ID_Einrichtung Bez_Oeffnungszeit_2 New
#1: 3000001 Abend 2.0
#2: 3000001 Nachmittag 1.0
#3: 3000001 Vormittag 0.5
#4: 3000003 Vormittag 4.5
#5: 3000008 Vormittag 2.5
#6: 3000023 Vormittag 1.0
#7: 3000025 Vormittag 1.0
#8: 3000026 Vormittag 1.0
我没有通过 grep 函数聚合另一列来计算包含数据框中一列总和的新列的正确方法。数据框如下所示:
ID_Oeffnungszeit ID_Einrichtung Anzahl_Std Bez_Oeffnungszeit
1 3000001 0.50 Montag Vormittag
1 3000003 3.00 Montag Vormittag
1 3000008 2.50 Montag Vormittag
2 3000001 1.00 Montag Nachmittag
4 3000003 1.50 Dienstag Vormittag
1 3000023 1.00 Montag Vormittag
1 3000025 1.00 Montag Vormittag
1 3000026 1.00 Montag Vormittag
3 3000001 2.00 Montag Abend
...
1 3000038 3.50 Montag Vormittag
and so on...
变量Bez_Oeffnungszeit
有21个特征,但如果其中包含Vormittag
、Nachmittag
或Abend
等词,则可以归为一类。
所以我想生成一个新列,其中包含每个 ID_Einrichtung
列 Anzahl_Std
的总和,具体取决于 Bez_Oeffnungszeit
包含的单词。
我很确定我应该使用 grep
和 by
函数,但我无法让它在我的意义上发挥作用...
df <- structure(list(ID_Oeffnungszeit = c("1", "1", "1", "2", "4",
"1", "1", "1", "3"), ID_Einrichtung = c(3000001L, 3000003L, 3000008L,
3000001L, 3000003L, 3000023L, 3000025L, 3000026L, 3000001L),
Anzahl_Std = c(0.5, 3, 2.5, 1, 1.5, 1, 1, 1, 2), Bez_Oeffnungszeit = c("Montag Vormittag",
"Montag Vormittag", "Montag Vormittag", "Montag Nachmittag",
"Dienstag Vormittag", "Montag Vormittag", "Montag Vormittag",
"Montag Vormittag", "Montag Abend")), .Names = c("ID_Oeffnungszeit",
"ID_Einrichtung", "Anzahl_Std", "Bez_Oeffnungszeit"), class = "data.frame", row.names = c(NA,
-9L))
我认为最简单的方法是创建一个仅包含单词 "Vormittag"、"Nachmittag" 或 "Abend" 的新列,然后将其用作分组变量。
例如:
# Set random seed for reproducibility
set.seed(12345)
# Make some data
my.data <- data.frame(ID_Oeffnungszeit = sample(1:10, 100, replace = TRUE),
ID_Einrichtung = sample(3000001:3000020, 100, replace = TRUE),
Anzahl_Std = rnorm(100),
Bez_Oeffnungszeit = sample(c("Montag Vormittag",
"Montag Nachmittag",
"Dienstag Vormittag",
"Montag Abend"), 100,
replace = T))
# Create a new column containing "Vormittag", "Nachmittag" or "Abend"
my.data$cat <- ""
my.data$cat[grep("Vormittag", my.data$Bez_Oeffnungszeit)] <- "Vormittag"
my.data$cat[grep("Nachmittag", my.data$Bez_Oeffnungszeit)] <- "Nachmittag"
my.data$cat[grep("Abend", my.data$Bez_Oeffnungszeit)] <- "Abend"
# Now just call aggregate over the Std variable using ID and category
# as grouping factors.
res <- aggregate(my.data$Anzahl_Std,
by = list(ID = my.data$ID_Einrichtung, cat = my.data$cat),
FUN = sum)
这里还有一个选项(使用问题中提到的数据)
library(splitstackshape)
第 1 步: 使用 splitstackshape 的 cSplit
函数利用 space 以 wide
格式拆分列 Bez_Oeffnungszeit
两个字之间。
这将生成包含第一个单词的两列 'Bez_Oeffnungszeit_1'
和包含第二个单词的 'Bez_Oeffnungszeit_2'
,第二个单词将在第二步中进一步使用
dt = cSplit(df, 'Bez_Oeffnungszeit', ' ', 'wide')
第 2 步: 我们使用 'Bez_Oeffnungszeit_2'
包含感兴趣的词和 'ID_Einrichtung'
列对 'Anzahl_Std'
使用 data.table
求和语法
dt[order(Bez_Oeffnungszeit_2), .(New = sum(Anzahl_Std)),
by = .(ID_Einrichtung, Bez_Oeffnungszeit_2)]
#output looks like:
# ID_Einrichtung Bez_Oeffnungszeit_2 New
#1: 3000001 Abend 2.0
#2: 3000001 Nachmittag 1.0
#3: 3000001 Vormittag 0.5
#4: 3000003 Vormittag 4.5
#5: 3000008 Vormittag 2.5
#6: 3000023 Vormittag 1.0
#7: 3000025 Vormittag 1.0
#8: 3000026 Vormittag 1.0