1

次のようなデータフレームがあります。

id = c("A","B","C","A","C","C")
val = c(5,4,6,7,10,99)
df = data.frame(id, val)
df


id val   
 A   5
 B   4
 C   6
 A   7
 C  10
 C  99

idここで、列 (A、B、C...)を再配置し、対応する を保持してから、文字 E で始まるval新しい列を追加し、その後に最初の列の数を数える 3 桁を追加します。コードは次のとおりです。newidid

id2 = c("A","A","B","C","C","C")
val2 = c(5,7,4,6,10,99)
newid = c("E001","E002","E001","E001","E002","E003")
df2 = data.frame(id2, val2, newid)
df2

最終結果は次のとおりです。

id2 val2 newid
  A    5  E001
  A    7  E002
  B    4  E001   
  C    6  E001
  C   10  E002
  C   99  E003

これを行う効率的な方法はありますか?

4

2 に答える 2

3
library(data.table)
dt = data.table(df)

dt[, newid := paste0('E', gsub(' ', '0', format(1:.N, width = 3))), keyby = id]
dt
#   id val newid
#1:  A   5  E001
#2:  A   7  E002
#3:  B   4  E001
#4:  C   6  E001
#5:  C  10  E002
#6:  C  99  E003

keybyここでソートを行うため、明示的に行う必要はありません

于 2013-06-18T19:20:29.610 に答える
2

これを行う 1 つの方法を次に示します。関数を使用しorder()てデータを配置し、sprintf()sapply()およびtable()関数を使用して を定義しますnewid

df2 <- df[order(df$id, df$val), ]
df2$newid <- paste0("E", sprintf("%04d", unlist(sapply(table(df$id), function(x) 1:x))))
于 2013-06-18T19:18:42.727 に答える