在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
提供一个数字向量要好。