我有一个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
循环,但没有成功......有什么建议吗?
最诚挚的问候!
答案 0 :(得分:4)
我认为你所要求的是
data$Code <- as.integer(as.factor(data$Namn))
或者只是将其作为一个因素。
答案 1 :(得分:2)
或者你可以这样做匹配...
data$Code <- match( data$Namn , unique(data$Namn))
for
和apply
首先,我想问一下为什么你在这种情况下如此热衷于使用for
或apply
循环?听起来很像你有一个要求你使用循环的作业?如果是这种情况,你应该获得额外的信用来回答你在向量化方法完全合适时拒绝使用它。如果你真的,真的需要使用一个循环出于某种奇怪的原因,实现这一点的许多例子之一可能是:
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。