无需聚合或group_by

时间:2017-10-26 04:41:24

标签: r dataframe

在浏览网页和StackOverFlow之后,我找不到解决方案。我正在尝试计算“NumIDShowsInCol_1”列中数据框内没有聚合或分组功能的“ID”数字显示的次数。如果正确完成,最终结果仍将拥有100个观察值。如果使用聚合或分组功能,则结果列<100并且不与数据帧合并。下面是示例代码和显示所需结果的结果数据框的示例。

set.seed(123)
df <- data.frame(ID = sample(1:30, 100, replace = T),
             TotalDays = sample(15:1000, 100, replace = T),
             NumEnroll = sample(1:3, 100, replace = T),
             NumIDShowsInCol_1 = sample(0, 100, replace = T))

Desired Outcome: 

     ID TotalDays NumEnroll NumIDShowsInCol_1
1     5       307         2                 3
2    12       945         1                 4
3    23        85         3                 5
4    19       650         2                 5
5    28       642         2                 3
6    17       191         3                 4

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

事实上,您可以使用dplyr::group_by来计算ID并且不会丢失任何观察结果:

library(dplyr)
df %>% 
  group_by(ID) %>% 
  mutate(NumIDShowsInCol_1 = n()) %>% 
  ungroup()

# A tibble: 100 x 4
      ID TotalDays NumEnroll NumIDShowsInCol_1
   <int>     <int>     <int>             <int>
 1     5       307         2                 3
 2    12       945         1                 4
 3    23        85         3                 5
 4    19       650         2                 5
 5    28       642         2                 3
 6    17       191         3                 4
 7     2       855         2                 4
 8     6       857         3                 5
 9    19       276         2                 5
10     8       934         2                 3
# ... with 90 more rows

答案 1 :(得分:0)

您必须与:=包中的data.table一起使用。

df <- data.frame(ID = sample(1:30, 100, replace = T),
                 TotalDays = sample(15:1000, 100, replace = T),
                 NumEnroll = sample(1:3, 100, replace = T),
                 NumIDShowsInCol_1 = sample(0, 100, replace = T))


library(data.table)
setDT(df)

df[,NumIDShowsInCol_1 := as.numeric(.N), ID]
df

您可以通过不预先生成NumIDShowsInCol_1来改进您的示例,因此无需将.N转换为数字。

df <- data.frame(ID = sample(1:30, 100, replace = T),
                 TotalDays = sample(15:1000, 100, replace = T),
                 NumEnroll = sample(1:3, 100, replace = T))


library(data.table)
setDT(df)

df[,NumIDShowsInCol_1 := .N, ID]
df
相关问题