获得R中最大的常用词

时间:2015-05-17 08:48:42

标签: r nlp

我有以下表格的数据:

ID       A1    A2    A3   ...   A100
1      john    max  karl  ...   kevin
2      kevin   bosy lary  ...   rosy
3      karl   lary  bosy  ...   hale
.
.
.
10000  isha   john  lewis ...   dave

我想为每个ID获取一个ID,以便它们都具有最大数量的公共属性(A1,A2,.. A100)

我怎样才能在R中这样做? 编辑:我们将输出调用为MatchId:

ID      MatchId
1        70
2        4000
.
.
10000   3000

3 个答案:

答案 0 :(得分:2)

我认为这会得到你想要的东西:

library(dplyr)

# make up some data

set.seed(1492)
rbind_all(lapply(1:15, function(i) {
  x <- cbind.data.frame(stringsAsFactors=FALSE, i, t(sample(LETTERS, 10)))
  colnames(x) <- c("ID", sprintf("A%d", 1:10))
  x
})) -> dat

print(dat)

## Source: local data frame [15 x 11]
## 
##    ID A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
## 1   1  H  F  E  C  B  A  R  J  Z   N
## 2   2  Q  P  E  M  L  Z  C  G  V   Y
## 3   3  Q  J  D  N  B  T  L  K  G   Z
## 4   4  D  Y  U  F  V  O  I  C  A   W
## 5   5  T  Z  D  I  J  F  R  C  B   S
## 6   6  Q  D  H  U  P  V  O  E  R   N
## 7   7  C  L  I  M  E  K  N  S  X   Z
## 8   8  M  J  S  E  N  O  F  Y  X   I
## 9   9  R  H  V  N  M  T  Q  X  L   S
## 10 10  Q  H  L  Y  B  W  S  M  P   X
## 11 11  M  N  J  K  B  G  S  X  V   R
## 12 12  W  X  A  H  Y  D  N  T  Q   I
## 13 13  K  H  V  J  D  X  Q  W  A   U
## 14 14  M  U  F  H  S  T  W  Z  O   N
## 15 15  G  B  U  Y  E  L  A  Q  W   O

# get commons

rbind_all(lapply(1:15, function(i) {
  rbind_all(lapply(setdiff(1:15, i), function(j) {
    data.frame(id1=i,
               id2=j,
               common=length(intersect(c(t(dat[i, 2:11])),
                                       c(t(dat[j, 2:11])))))
  }))
})) -> commons

commons %>%
  group_by(id1) %>%
  top_n(1, common) %>%
  filter(row_number()==1) %>%
  select(ID=id1, MatchId=id2)

## Source: local data frame [15 x 2]
## Groups: ID
## 
##    ID MatchId
## 1   1       5
## 2   2       7
## 3   3       5
## 4   4      12
## 5   5       1
## 6   6       9
## 7   7       8
## 8   8       7
## 9   9      10
## 10 10       9
## 11 11       9
## 12 12      13
## 13 13      12
## 14 14       8
## 15 15       2

答案 1 :(得分:2)

使用@hrbrmstr

提供的类似数据
set.seed(1492)
dat <- do.call(rbind, lapply(1:15, function(i) {
  x <- cbind.data.frame(stringsAsFactors=FALSE, i, t(sample(LETTERS, 10)))
  colnames(x) <- c("ID", sprintf("A%d", 1:10))
  x
})) 

您只能使用基数R

来实现相同的目标
Res <- sapply(seq_len(nrow(dat)), 
              function(x) apply(dat[-1], 1, 
              function(y) length(intersect(dat[x, -1], y))))
diag(Res) <- -1
cbind(dat[1], MatchId = max.col(Res, ties.method = "first"))
#    ID MatchId
# 1   1       5
# 2   2       7
# 3   3       5
# 4   4      12
# 5   5       1
# 6   6       9
# 7   7       8
# 8   8       7
# 9   9      10
# 10 10       9
# 11 11       9
# 12 12      13
# 13 13      12
# 14 14       8
# 15 15       2

答案 2 :(得分:0)

如果我理解正确,则要求获取每个ID的最大公共属性数。

频率表可以使用table()获得并递归地lapply()获取,假设ID列是唯一的 - 如果不是(unique(df$ID)而不是df$ID,则需要稍作修改lapply())。可以采用最大频率,如果存在平局,则仅选择第一个频率。最后,它们由do.call()合并。

df <- read.table(header = T, text = "
ID       A1    A2    A3   A100
1      john    max  karl  kevin
2      kevin   bosy lary  rosy
3      karl   lary  bosy  hale
10000  isha   john  lewis dave")

do.call(rbind, lapply(df$ID, function(x) {
  tbl <- table(unlist(df[df$ID == x, 2:ncol(df)]))
  data.frame(ID = x, MatchId = tbl[tbl == max(tbl)][1])
}))

#         ID MatchId
#john      1       1
#kevin     2       1
#karl      3       1
#isha  10000       1