R-快速方法,基于具有很多值的列有条件分配值



假设我的数据看起来像这样:

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

我有兴趣找到访问给定位置的频率,然后根据位置列中的值将该频率(即sum(分配给新列。

开始,我尝试使用table函数:

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

从这里开始,我想在DF中创建一个新列,称为Count,该列为每个ID分配了与位置= 54相对应的每个ID。即,DF现在看起来像这样:

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

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

谢谢!

我们可以从dplyr中使用add_count(在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")
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

您可以使用ave来计数与每个Location

相对应的数据的length
ave(1:NROW(df), df$Location, FUN = length)
#[1] 2 2 2 2 1

也可以在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")

最新更新