在r中修改数据帧的有效方法
我有一个如下所示的数据帧(但要大得多)在r中修改数据帧的有效方法,r,R,我有一个如下所示的数据帧(但要大得多) 添加我需要的列的有效方法是什么?您可以通过按日期拆分、添加新列和重建df来完成此操作: out <- lapply(split(df,df$Claim), function(x) { ValuationNumber <- 1:dim(x)[1] cbind(x,ValuationNumber) }) dfout <- do.call(rbind, out) 结果是: Claim ValuationDate V
添加我需要的列的有效方法是什么?您可以通过按日期拆分、添加新列和重建df来完成此操作:
out <- lapply(split(df,df$Claim), function(x) {
ValuationNumber <- 1:dim(x)[1]
cbind(x,ValuationNumber)
})
dfout <- do.call(rbind, out)
结果是:
Claim ValuationDate ValuationNumber
117.1 117 01/05/1965 1
249.2 249 01/05/1980 1
117.3 117 01/10/1965 2
652 652 01/10/1990 1
117.4 117 01/20/1965 3
249.5 249 01/30/1980 2
您可以通过按日期拆分、添加新列和重建df来完成此操作:
out <- lapply(split(df,df$Claim), function(x) {
ValuationNumber <- 1:dim(x)[1]
cbind(x,ValuationNumber)
})
dfout <- do.call(rbind, out)
结果是:
Claim ValuationDate ValuationNumber
117.1 117 01/05/1965 1
249.2 249 01/05/1980 1
117.3 117 01/10/1965 2
652 652 01/10/1990 1
117.4 117 01/20/1965 3
249.5 249 01/30/1980 2
这与数据非常相似。表问题:
library(data.table)
dt = data.table(df)
dt[, ValuationNumber := 1:.N, by = Claim]
dt
# Claim ValuationDate ValuationNumber
#1: 117 01/05/1965 1
#2: 249 01/05/1980 1
#3: 117 01/10/1965 2
#4: 117 01/20/1965 3
#5: 249 01/30/1980 2
#6: 652 01/10/1990 1
这与数据非常相似。表问题:
library(data.table)
dt = data.table(df)
dt[, ValuationNumber := 1:.N, by = Claim]
dt
# Claim ValuationDate ValuationNumber
#1: 117 01/05/1965 1
#2: 249 01/05/1980 1
#3: 117 01/10/1965 2
#4: 117 01/20/1965 3
#5: 249 01/30/1980 2
#6: 652 01/10/1990 1
使用
plyr
:
ddply(df, "Claim", function(d) { d$ValuationNumber <- seq_along(d$Claim); d})
ddply(df,“索赔”,函数(d){d$ValuationNumber使用plyr
:
ddply(df, "Claim", function(d) { d$ValuationNumber <- seq_along(d$Claim); d})
ddply(df,“Claim”,函数(d){d$ValuationNumberR基解
> transform(df, ValuationNumber=ave(rep(1,nrow(df)), df$Claim, FUN=seq))
Claim ValuationDate ValuationNumber
1 117 01/05/1965 1
2 249 01/05/1980 1
3 117 01/10/1965 2
4 117 01/20/1965 3
5 249 01/30/1980 2
6 652 01/10/1990 1
R基解
> transform(df, ValuationNumber=ave(rep(1,nrow(df)), df$Claim, FUN=seq))
Claim ValuationDate ValuationNumber
1 117 01/05/1965 1
2 249 01/05/1980 1
3 117 01/10/1965 2
4 117 01/20/1965 3
5 249 01/30/1980 2
6 652 01/10/1990 1
如果这是在已知在索赔编号内排序的数据集上进行的,则很容易:
df$ValuationNumber <- ave(
as.numeric(as.Date( as.character(df$ValuationDate), format="%m/%d/%Y")),
df$Claim,
FUN=seq_along) # actually turned out to be some what not-easy.
df$ValuationNumber如果这是在已知在索赔编号内排序的数据集上进行的,那么将非常简单:
df$ValuationNumber <- ave(
as.numeric(as.Date( as.character(df$ValuationDate), format="%m/%d/%Y")),
df$Claim,
FUN=seq_along) # actually turned out to be some what not-easy.
df$ValuationNumber注意,您不是按日期排序,而是按字典排序(无论哪种方式,您都会丢失原始顺序)。@eddi没错,但顺序很少重要。请注意,您不是按日期排序,而是按字典排序(无论哪种方式,您都会丢失原始顺序)@eddi这是真的,但顺序很少重要。在这种情况下,.N
应该始终是=1
,seq_len(.N)
是一个更安全的习惯用法,可以用来避免1:0
陷阱(很容易发生)(参见fortune(26)
),而在这种情况下,.N
应该始终是=1
,seq_len
是一个更安全的习惯用法,可以用来避免1:0
陷阱(这很容易发生(参见fortune(26)
)ddply(df,“索赔”,mutate,ValuationNumber=seq_-along(索赔))
更容易阅读,打字更少,仍然是一个plyr
解决方案ddply(df,“索赔”,mutate,ValuationNumber=seq_-along(索赔))
比我笨手笨脚地为ave
提供一个数字向量要好一点,输入更少,仍然是一个plyr
解决方案。比我笨手笨脚地为ave
提供一个数字向量要好。