Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 向数据帧添加新变量_R_Variables_Sampling - Fatal编程技术网

R 向数据帧添加新变量

R 向数据帧添加新变量,r,variables,sampling,R,Variables,Sampling,使用RStudio,我有以下几点: GROUP NUM A 45 A 78 A 79 B 45 B 47 B 99 C 28 C 78 C 54 我想添加一个名为AGENT的新变量,它是: AGENT=c("John", "Maria", "Pamela") 但问题是,我希望我的每个代理都根据ID在初始数据帧之间平均分布。基本上,我希望: GROUP NUM AGENT A 45 John A 78

使用RStudio,我有以下几点:

GROUP NUM
A     45
A     78
A     79  
B     45
B     47
B     99
C     28
C     78
C     54
我想添加一个名为AGENT的新变量,它是:

AGENT=c("John", "Maria", "Pamela")
但问题是,我希望我的每个代理都根据ID在初始数据帧之间平均分布。基本上,我希望:

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个字母(70 A,70 B和70 C),仍然只有3个代理。我仍然希望他们尽可能平等地分布

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

GROUP NUM AGENT
A     45  John
A     78  Maria
A     79  Pamela
A     48  John
A     97  Maria
A     59  Pamela
...
如果我有7个,那么第7个将被随机分配,或者只是列表中的下一个


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

我想出了一个使用索引的有点复杂的方法。也许有更简单的方法。代码如下:

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
试试这个-

# 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)])
       })
#数据
df如果“或列表上的下一个”适用于组较大时的任何溢出,您可以利用向量循环,只需在一个赋值中完成:

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

我不是反对者,但我怀疑
的使用我找到了类似问题的答案。它也适用于我,但我要添加的向量包含日期。当我这样添加它时,日期被转换成数字变量。在as.Date()中简单地用(…)包装是行不通的。它抛出错误:必须提供“origin”。有什么想法吗?@Tingolfin-您可以手动将默认的
origin=
指定为.Date(ave(…),origin=“1970-01-01”)
,或者在初始
ave
调用中使用
Date
对象,比如
ave(rep(AGENT[1],nrow(dat)),dat$GROUP,FUN=function(x)AGENT)
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
library(data.table)
setDT(dat)
dat[, newvar2 := AGENT, by=GROUP]