R 向数据帧添加新变量
使用RStudio,我有以下几点: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
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]