我正在努力在data.frame中创建一个新变量。我为问题标题道歉,可能不太清楚。我有一个看起来像这样的数据库:
obs year type
1 2015 A
2 2015 A
3 2015 B
4 2014 A
5 2014 B
我想在当前data.frame中添加一列(freq2015),该列提供2015年类型的行数,并且只要类型相同,就会报告结果,而不考虑所考虑的年份。这是我要找的输出:
obs year type freq2015
1 2015 A 2 (there are 2 obs. of type A in 2015)
2 2015 A 2 (there are 2 obs. of type A in 2015)
3 2015 B 1 (there is 1 obs. of type B in 2015)
4 2014 A 2 (there are 2 obs. of type A in 2015)
5 2014 B 1 (there are 1 obs. of type B in 2015)
我知道如何使用data.frame
按年份按类型添加dplyr
行数:
data <- data %>%
group_by(year, type) %>%
mutate(freq = n())
但是,对于年份==“2014”,添加的列将按种族而不是2015年显示2014年的行数。
我知道如何通过2015年种族隔离新行data.frame
:
data2015 <- dat[dat$year==2015,] %>%
group_by(type) %>%
mutate(freq2015 = n())
但是我不知道如何为整个data.frame添加一个列(按比例划分2015年的行数),条件是类型相同(如示例所示)。我正在寻找一种可以阻止我明确使用“类型”变量模态的解决方案。也就是说,我不想使用代码告诉R:如果键入== A,请执行此操作,否则执行此操作。这种限制的原因是我的类型太多了。
有什么想法吗?提前谢谢。
答案 0 :(得分:2)
如果group_by
仅使用type
,则可以在year == 2015
时对行进行求和。
data %>%
group_by(type) %>%
mutate(freq2015 = sum(year == 2015))
Source: local data frame [5 x 4]
Groups: type [2]
obs year type freq2015
<int> <int> <fctr> <int>
1 1 2015 A 2
2 2 2015 A 2
3 3 2015 B 1
4 4 2014 A 2
5 5 2014 B 1
答案 1 :(得分:0)
使用我们可以做的数据表:
setDT(df)
setkey(df,type)
df[ df[ year==2015, .(freq2015=.N), by = type]]
结果:
obs year type freq2015
1: 1 2015 A 2
2: 2 2015 A 2
3: 4 2014 A 2
4: 3 2015 B 1
5: 5 2014 B 1
答案 2 :(得分:0)
您可以使用left_join()
,如下所示:
temp <- data %>%
filter(year==2015) %>%
group_by(type) %>%
summarize(freq = n())# %>%
data <- data %>% left_join(temp, "type")
答案 3 :(得分:0)
我们可以使用base R
使用ave
(没有任何外部软件包)执行此操作,并且速度也相当快。
df1$freq2015 <- with(df1, ave(year == 2015, type, FUN = sum))
df1$freq2015
#[1] 2 2 1 2 1