R 按列和行组计算唯一值

R 按列和行组计算唯一值,r,R,我有一个例子:df.Journal.Conferences venue author0 author1 author2 ... author19 A John Mary B Peter Jacob Isabella C Lia B Jacob Lara John C Mary B Isabella 我想知道每个地点有多少独特的作者 结果: A 2 B 5 C 2 编辑: 这是我的数据链接:。因为你的数据很难复制,我生

我有一个例子:df.Journal.Conferences

venue author0 author1 author2 ... author19
A     John    Mary
B     Peter   Jacob   Isabella  
C     Lia
B     Jacob   Lara    John
C     Mary
B     Isabella
我想知道每个地点有多少独特的作者

结果:

A 2
B 5
C 2
编辑:
这是我的数据链接:。

因为你的数据很难复制,我生成了一个类似的数据集, 这应该是一个词

set.seed(1984)
df <- data.frame(id = sample(1:5,10, replace= T), 
                 v1 = sample(letters[1:5],10,replace= T),
                 v2 = sample(letters[1:5],10,replace= T),
                 v3 = sample(letters[1:5],10,replace= T),
                 v4 = sample(letters[1:5],10,replace= T), 
                 stringsAsFactors = F)


z <- data.frame( id = unique(df$id), n = NA )

for (i in z$id)  {

  z$n[z$id == i] <- length(unique(unlist(df[df$id == i,-1])))

}

z
#   id n
# 1  4 4
# 2  3 4
# 3  2 4
# 4  5 4
# 5  1 3

因为你的数据很难复制,我生成了一个类似的数据集, 这应该是一个词

set.seed(1984)
df <- data.frame(id = sample(1:5,10, replace= T), 
                 v1 = sample(letters[1:5],10,replace= T),
                 v2 = sample(letters[1:5],10,replace= T),
                 v3 = sample(letters[1:5],10,replace= T),
                 v4 = sample(letters[1:5],10,replace= T), 
                 stringsAsFactors = F)


z <- data.frame( id = unique(df$id), n = NA )

for (i in z$id)  {

  z$n[z$id == i] <- length(unique(unlist(df[df$id == i,-1])))

}

z
#   id n
# 1  4 4
# 2  3 4
# 3  2 4
# 4  5 4
# 5  1 3

使用dplyr和tidyr,将数据从宽改为长,然后按计数分组

library(dplyr)
library(tidyr)

gather(df1, key = author, value = name, -venue) %>% 
  select(venue, name) %>% 
  group_by(venue) %>% 
  summarise(n = n_distinct(name, na.rm = TRUE))
# # A tibble: 3 × 2
#   venue     n
#   <chr> <int>
# 1     A     2
# 2     B     5
# 3     C     2
数据 编辑:将Excel工作表保存为CSV,然后使用read.CSV读入,然后上述代码返回以下输出:

df1 <- read.csv("Journal_Conferences_Authors.csv", na.strings = "#N/A")

# output

# # A tibble: 427 × 2
#                                     venue     n
#                                    <fctr> <int>
# 1                                    AAAI     4
# 2                                     ACC     4
# 3                               ACIS-ICIS     5
# 4  ACM SIGSOFT Software Engineering Notes     1
# 5       ACM Southeast Regional Conference     5
# 6                                ACM TIST     3
# 7       ACM Trans. Comput.-Hum. Interact.     3
# 8                                    ACML     2
# 9                                    ADMA     2
# 10             Advanced Visual Interfaces     3
# # ... with 417 more rows

使用dplyr和tidyr,将数据从宽改为长,然后按计数分组

library(dplyr)
library(tidyr)

gather(df1, key = author, value = name, -venue) %>% 
  select(venue, name) %>% 
  group_by(venue) %>% 
  summarise(n = n_distinct(name, na.rm = TRUE))
# # A tibble: 3 × 2
#   venue     n
#   <chr> <int>
# 1     A     2
# 2     B     5
# 3     C     2
数据 编辑:将Excel工作表保存为CSV,然后使用read.CSV读入,然后上述代码返回以下输出:

df1 <- read.csv("Journal_Conferences_Authors.csv", na.strings = "#N/A")

# output

# # A tibble: 427 × 2
#                                     venue     n
#                                    <fctr> <int>
# 1                                    AAAI     4
# 2                                     ACC     4
# 3                               ACIS-ICIS     5
# 4  ACM SIGSOFT Software Engineering Notes     1
# 5       ACM Southeast Regional Conference     5
# 6                                ACM TIST     3
# 7       ACM Trans. Comput.-Hum. Interact.     3
# 8                                    ACML     2
# 9                                    ADMA     2
# 10             Advanced Visual Interfaces     3
# # ... with 417 more rows

使用@zx8754数据进行测试,假设数据框中的空单元格具有NA,则此代码提供了所需的want:

sapply(split(df1[,-1], df1$venue), function(x) length(unique(x[!is.na(x)])))
# A B C 
# 2 5 2 

使用@zx8754数据进行测试,假设数据框中的空单元格具有NA,则此代码提供了所需的want:

sapply(split(df1[,-1], df1$venue), function(x) length(unique(x[!is.na(x)])))
# A B C 
# 2 5 2 

没用。如果我有一个场地的多行,它会带来两行不同的值。很抱歉,我没有意识到场地不明显,我编辑了答案。我发现了一个错误,我再次编辑,检查最后一个版本。在你的例子中,它应该返回:id=n,4=4,3=4,2=4,5=4 1=3我做得有点太快了,现在应该修好了,坏了。如果我有一个场地的多行,它会带来两行不同的值。很抱歉,我没有意识到场地不明显,我编辑了答案。我发现了一个错误,我再次编辑,检查最后一个版本。在你的例子中,它应该返回:id=n,4=4,3=4,2=4,5=4 1=3我做得有点太快了,现在应该修好了,对我没用。返回1X1表,其中包含所有items@ABueno请提供@ABueno对您的数据进行测试,解决方案运行良好,请参阅编辑,了解如何将您的文件读入R。返回1X1表,其中包含所有items@ABueno请在您的数据上提供@ABueno测试,解决方案工作正常,请参阅编辑,了解如何将文件读入R。它必须计算唯一值。结果必须是2B5C2sorry,然后应该是:sapplysplitdf1[,-1],df1$VICE,functionx lengthuniquex[!is.nax]。我将编辑它。它必须计算唯一值。结果必须是2B5C2sorry,然后应该是:sapplysplitdf1[,-1],df1$VICE,functionx lengthuniquex[!is.nax]。我会编辑它。