我没有通过grep函数通过聚合anothor列来计算新列的正确方法,该列包含数据框中列的总和。数据框如下所示:

   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个特征,但是由于它们包含单词VormittagNachmittagAbend,因此可以对其进行分类。
因此,我想生成一个新列,其中包含每个Anzahl_StdID_Einrichtung列的总和,具体取决于Bez_Oeffnungszeit包含的单词。

我很确定我应该使用grepby函数,但是我无法使它在我看来有效。
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)

10-08 03:10