如何根据其他列中的条件创建具有唯一值的列?

时间:2013-03-22 11:00:07

标签: r for-loop conditional-statements lapply

我有一个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))

我尝试lapplyfor循环,但没有成功......有什么建议吗? 最诚挚的问候!

2 个答案:

答案 0 :(得分:4)

我认为你所要求的是

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

或者只是将其作为一个因素。

答案 1 :(得分:2)

或者你可以这样做匹配...

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

修改 - 在这种情况下关于forapply

首先,我想问一下为什么你在这种情况下如此热衷于使用forapply循环?听起来很像你有一个要求你使用循环的作业?如果是这种情况,你应该获得额外的信用来回答你在向量化方法完全合适时拒绝使用它。如果你真的,真的需要使用一个循环出于某种奇怪的原因,实现这一点的许多例子之一可能是:

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。