R用索引显示的值替换值

时间:2014-09-10 00:49:57

标签: r merge indexing

我有一个名为“merged”的表,如:

  Nationality CustomerID_count ClusterId
1   argentina          1         1
2   ARGENTINA         26         1
3   ARGENTINO          1         1
4   argentona          1         1
5   boliviana         14         2
6    paragauy          1         3
7    paraguay          1         3
8    PARAGUAY          1         3

我需要创建一个新的国籍列,在每个群集中搜索Customer_ID_count的最大值。

我使用以下代码执行了另一个表:

merged1<-data.table(merged)
merged2<-merged1[, which.max(CustomerID), by = ClusterId]

我得到了:

ClusterId V1
1:         1  2
2:         2  1
3:         3  1

之后我做了合并:

tot<-merge(x=merged, y=merged2, by= "ClusterId", all.x=TRUE)

我得到了下表:

 ClusterId Nationality CustomerID V1
1         1   argentina          1  2
2         1   ARGENTINA         26  2
3         1   ARGENTINO          1  2
4         1   argentona          1  2
5         2   boliviana         14  1
6         3    paragauy          1  1
7         3    paraguay          1  1
8         3    PARAGUAY          1  1

但我不知道如何完成。我试过这个:

 tot[,5]=tot[V1,5]

因为我希望每一行都有第V1列所示行中的国籍。这没用。

我怎样才能完成最后一部分?还有更好的解决方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这可能是`dplyr:

的一个很好的用例
library(dplyr)


merged <- merged %>% 
          group_by(ClusterId) %>%
          mutate(newNat=Nationality[CustomerID_count == max(CustomerID_count)]) %>%
          ungroup

print(merged)

##     Source: local data frame [8 x 4]
## 
##   Nationality CustomerID_count ClusterId    newNat
## 1   argentina                1         1 ARGENTINA
## 2   ARGENTINA               26         1 ARGENTINA
## 3   ARGENTINO                1         1 ARGENTINA
## 4   argentona                1         1 ARGENTINA
## 5   boliviana               14         2 boliviana
## 6    paragauy                1         3  paragauy
## 7    paraguay                1         3  paraguay
## 8    PARAGUAY                1         3  PARAGUAY

答案 1 :(得分:1)

请注意,您可能有多个CustomerID_count与最大值匹配(例如,所有版本的“paraguay”都有CustomerID_count == 1,这是该群集的最大值。)

使用plyr包很容易:

library(plyr)
ddply(merged, .(ClusterId), mutate, Nationality2 = Nationality[CustomerID_count == max(CustomerID_count)])