首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将新变量均匀添加到dataframe

将新变量均匀添加到dataframe
EN

Stack Overflow用户
提问于 2016-11-29 07:42:33
回答 3查看 71关注 0票数 3

使用RStudio,我得到了以下内容:

代码语言:javascript
复制
GROUP NUM
A     45
A     78
A     79  
B     45
B     47
B     99
C     28
C     78
C     54

我想添加一个名为AGENT的新变量,它是:

代码语言:javascript
复制
AGENT=c("John", "Maria", "Pamela")

但问题是,我希望我的每个Agent根据ID平均分布在初始数据帧中。基本上,我希望这样:

代码语言:javascript
复制
GROUP NUM AGENT
A     45  John
A     78  Maria
A     79  Pamela
B     45  John 
B     47  Maria
B     99  Pamela
C     28  John
C     78  Maria
C     54  Pamela

我这里的例子很基本,因为我有的组和我的代理一样多。然而,在我的例子中,我可能每封信有70个(70A,70B和70C),仍然只有3个代理。我仍然希望他们尽可能平均地分配……

例如,如果我有6个A,我就会:

代码语言:javascript
复制
GROUP NUM AGENT
A     45  John
A     78  Maria
A     79  Pamela
A     48  John
A     97  Maria
A     59  Pamela
...

如果我有7个,那么第7个将被随机分配,或者只是列表中的下一个。

有什么想法吗?我一直在为此折磨自己。提前感谢!:P

EN

回答 3

Stack Overflow用户

发布于 2016-11-29 09:10:42

如果是“或者只是列表中的下一个”。适用于任何溢出时,当组更大时,您可以利用向量回收的优势,只需在一个任务中完成:

代码语言:javascript
复制
dat$newvar <- with(dat, ave(1:nrow(dat), GROUP, FUN=function(x) AGENT) )
dat
#  GROUP NUM newvar
#1     A  45   John
#2     A  78  Maria
#3     A  79 Pamela
#4     B  45   John
#5     B  47  Maria
#6     B  99 Pamela
#7     C  28   John
#8     C  78  Maria
#9     C  54 Pamela

如果组的大小与AGENT大小不匹配,请忽略可能收到的任何警告

data.table也可以以类似的方式使用:

代码语言:javascript
复制
library(data.table)
setDT(dat)
dat[, newvar2 := AGENT, by=GROUP]
票数 3
EN

Stack Overflow用户

发布于 2016-11-29 08:19:09

我想出了一种使用索引来完成此任务的复杂方法。也许有一种更简单的方法。代码如下:

代码语言:javascript
复制
library(dplyr)
AGENT <- c("John", "Maria", "Paul") 

fun <- function(x){
 x %>% mutate(agent=AGENT[((1:nrow(.) - 1) %% 3) + 1])
}

df %>% 
  split(.$GROUP) %>%
  lapply(fun) %>%
  bind_rows()

  GROUP NUM agent
1     A  45  John
2     A  78 Maria
3     A  79  Paul
4     B  45  John
5     B  47 Maria
6     B  99  Paul
7     C  28  John
8     C  78 Maria
9     C  54  Paul

如果没有太多的数据或者GROUP的长度不是AGENT的倍数,它将按照AGENT的顺序创建变量。

代码语言:javascript
复制
df1 

GROUP NUM
1     A  45
2     A  78
3     B  45
4     C  28

df1 %>% 
  split(.$GROUP) %>%
  lapply(fun) %>%
  bind_rows()

  GROUP NUM agent
1     A  45  John
2     A  78 Maria
3     B  45  John
4     C  28  John
票数 0
EN

Stack Overflow用户

发布于 2016-11-29 08:33:36

试试这个-

代码语言:javascript
复制
# Data
df <- data.frame("GROUP" = c("A","A","A","A","B","B","C","C","C"),
             "NUM" = c(45,78,79,45,47,99,28,78,54))
AGENT=c("John", "Maria", "Pamela")

# Assign agents
df$agent <- NA
groups <- levels(factor(df$GROUP))

lapply(groups, function(x)
       {
        df[df$GROUP == x, "agent"] <<- 
        c(rep(AGENT, as.integer(length(df[df$GROUP == x, "NUM"]) / 3)),
          AGENT[0:(length(df[df$GROUP == x, "NUM"]) %% 3)])
       })

如果有3个以上的代理,请将脚本中的3替换为长度(代理)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40855448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档