根据具有大量值的列有条件地分配值的快速方法?

时间:2017-04-24 20:45:39

标签: r dplyr conditional

假设我的数据如下:

df
ID  Location  
 1   54
 2   35 
 3   54
 4   35
 5   71

我有兴趣查找指定位置的访问频率,然后根据“位置”列中的值将该频率(即总和)分配给新列。

首先,我尝试使用table函数:

count<-as.data.frame(table(df))
count
var1  freq
54    2
35    2
71    1

从这里开始,我想在df中创建一个名为count的新列,例如,为每个ID分配freq = 2,对应于Location = 54。即,df现在看起来像这样:

df
ID  Location count 
 1   54      2
 2   35      2
 3   54      2
 4   35      2
 5   71      1

我的真实数据包含太多的位置值,我可以写一个ifelse语句来有条件地分配这些计数值。我不确定如何以有效的方式完成(我也可以创建一个空列并在dplyr中使用replace函数,但这同样费力。任何提示?

谢谢!

4 个答案:

答案 0 :(得分:3)

我们可以使用add_count中的dplyr(在devel版本中 - 很快就会发布0.6.0)

library(dplyr)
df %>% 
   add_count(Location)
# A tibble: 5 × 3
#     ID Location     n
#   <int>    <int> <int>
#1     1       54     2
#2     2       35     2
#3     3       54     2
#4     4       35     2
#5     5       71     1

但如果我们想从table输出中执行此操作,我们可以使用merge

merge(df, as.data.frame(table(df$Location)), by.x= "Location", by.y = "Var1")

答案 1 :(得分:3)

library(dplyr)
df %>% 
  group_by(Location) %>%
  mutate(n = n())

#      ID Location     n
#   <int>    <int> <int>
# 1     1       54     2
# 2     2       35     2
# 3     3       54     2
# 4     4       35     2
# 5     5       71     1

答案 2 :(得分:2)

您可以使用ave来计算与每个length对应的数据Location

ave(1:NROW(df), df$Location, FUN = length)
#[1] 2 2 2 2 1

答案 3 :(得分:2)

也可以在data.table中执行此操作:

library(data.table)
dt[,count := .N, by = Location]

dt
#   ID Location count
#1:  1       54     2
#2:  2       35     2
#3:  3       54     2
#4:  4       35     2
#5:  5       71     1

数据:

dt <- fread("ID  Location  
              1   54
              2   35 
              3   54
              4   35
              5   71")