0

我有一个data.frame:

head(data)
    År                        Namn N_medlemmar
1 1938  Asea-personalens erk. Csk.        8796
2 1938 Bohuslän-Hallands erk. Csk.       73765
3 1938    Dala-Gäleborgs erk. Csk.       87053
4 1938     De dövstummas erk. Csk.         718
5 1938  Eskilstuna stads erk. Csk.       15657
6 1938       Gefle stads erk. Csk.        9316

我想添加一个Code具有基于上述条件的唯一值的列Name column。例如:

    År                        Name N_medlemmar  Code
1 1938   Asea-personalens erk. Csk.        8796  1
2 1938  Bohuslän-Hallands erk. Csk.       73765  2
3 1939  Bohuslän-Hallands erk. Csk.       12392  2
4 1940     Dala-Gäleborgs erk. Csk.       87053  3
5 1941      De dövstummas erk. Csk.         718  4
6 1942   Eskilstuna stads erk. Csk.       15657  5
7 1943   Eskilstuna stads erk. Csk.        9316  5

所以该Code列是一个以Name上面列为条件的唯一值。

dput(data)
structure(list(År = c(1938L, 1938L, 1938L, 1938L, 1938L, 1938L
), Namn = c("Asea-personalens erk. Csk.", "Bohuslän-Hallands erk. Csk.", 
"Dala-Gäleborgs erk. Csk.", "De dövstummas erk. Csk.", "Eskilstuna stads erk. Csk.", 
"Gefle stads erk. Csk."), N_medlemmar = c(8796L, 73765L, 87053L, 
718L, 15657L, 9316L)), .Names = c("År", "Namn", "N_medlemmar"
), class = "data.frame", row.names = c(NA, 6L))

我尝试循环但没有成功...lapply有什么建议吗?for最好的祝福!

4

2 回答 2

4

我想你要的是

data$Code <- as.integer(as.factor(data$Namn))

或者只是把它作为一个因素。

于 2013-03-22T11:08:03.110 回答
2

或者你可以用 match 来做这样的事情......

data$Code <- match( data$Namn , unique(data$Namn))

编辑 - 关于forapply在这种情况下

首先我想问一下你为什么在这种情况下如此热衷于使用fororapply循环?这听起来很像你有一个要求你使用循环的任务?如果是这种情况,当矢量化方法完全合适时,您应该回答您拒绝使用一种方法,从而获得额外的奖励。如果您真的非常需要出于某种奇怪的原因使用循环,那么实现此目的的众多示例之一可能是:

data$Code <- rep( NA , nrow(data) )
for( i in 1:nrow(data) ){
  data$Code[i] <- match( data$Namn[i] , unique(data$Namn))
}

你明白为什么这本质上更糟吗?除了效率较低之外,您还必须进行更多的键入和索引才能获得相同的结果。简而言之,不要这样做!

我也真的建议你不要这样做(在这种情况下)......

data$Code <- unlist( lapply( data[,"Namn"] , function(x){ match( x , unique(data$Namn)) } ) )

使用向量 Luke。

于 2013-03-22T11:09:10.173 回答