นับจำนวนที่เกิดขึ้นสำหรับแต่ละค่าที่ไม่ซ้ำกัน


140

สมมติว่าฉันมี:

v = rep(c(1,2, 2, 2), 25)

ตอนนี้ฉันต้องการนับจำนวนครั้งที่แต่ละค่าไม่ซ้ำกันปรากฏขึ้น unique(v) ส่งคืนค่าที่ไม่ซ้ำกัน แต่ไม่ได้เป็นจำนวน

> unique(v)
[1] 1 2

ฉันต้องการบางสิ่งที่ให้ฉัน

length(v[v==1])
[1] 25
length(v[v==2])
[1] 75

แต่ในฐานะที่เป็นหนึ่งซับทั่วไป :) สิ่งที่ใกล้เคียง (แต่ไม่มาก) เช่นนี้:

#<doesn't work right> length(v[v==unique(v)])

คำตอบ:


179

บางทีตารางคือสิ่งที่คุณเป็นหลังจาก?

dummyData = rep(c(1,2, 2, 2), 25)

table(dummyData)
# dummyData
#  1  2 
# 25 75

## or another presentation of the same data
as.data.frame(table(dummyData))
#    dummyData Freq
#  1         1   25
#  2         2   75

7
อ้อใช่ฉันสามารถใช้กับการปรับเปลี่ยนเล็กน้อย: T (as.data.frame (ตาราง (V)) [2]) เป็นสิ่งที่ฉันต้องขอขอบคุณ
gakera

1
histผมใช้ในการทำเช่นนี้กับเชื่องช้า ดูเหมือนว่าค่อนข้างช้ากว่าtable histฉันสงสัยว่าทำไม. มีใครยืนยันได้บ้าง
Muse

2
ติดตามโอกาสในการสั่งซื้อตามความถี่ใด ๆ ฉันมีปัญหาเดียวกันแน่นอน แต่ตารางของฉันมีรายการประมาณ 20,000 รายการและฉันต้องการทราบว่ารายการที่พบบ่อยที่สุดคือเท่าไร
Torvon

5
@ Torvon - แน่นอนเพียงใช้order()กับผลลัพธ์ iex <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Chase

วิธีนี้ไม่ดีมันเหมาะสำหรับข้อมูลน้อยมากที่มีการทำซ้ำมากมันจะไม่พอดีกับข้อมูลต่อเนื่องจำนวนมากที่มีการบันทึกซ้ำสองสามครั้ง
Deep North

26

หากคุณมีหลายปัจจัย (= กรอบข้อมูลหลายมิติ) คุณสามารถใช้dplyrแพคเกจเพื่อนับค่าที่ไม่ซ้ำกันในการรวมกันของปัจจัยต่างๆ:

library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())

มันใช้ประกอบท่อสายโซ่วิธีการในกรอบข้อมูล%>%data


21

aggregateมันเป็นวิธีการหนึ่งบรรทัดโดยใช้

> aggregate(data.frame(count = v), list(value = v), length)

  value count
1     1    25
2     2    75

11

ฟังก์ชั่นตาราง () เป็นวิธีที่ดีที่จะไปตามที่แนะนำChase หากคุณกำลังวิเคราะห์ชุดข้อมูลขนาดใหญ่ทางเลือกหนึ่งคือการใช้ฟังก์ชัน. N ในแพ็คเกจที่สามารถจัดเก็บได้

ตรวจสอบให้แน่ใจว่าคุณติดตั้งแพ็กเกจตารางข้อมูลโดย

install.packages("data.table")

รหัส:

# Import the data.table package
library(data.table)

# Generate a data table object, which draws a number 10^7 times  
# from 1 to 10 with replacement
DT<-data.table(x=sample(1:10,1E7,TRUE))

# Count Frequency of each factor level
DT[,.N,by=x]

8

c()จะได้รับการยกเลิกมิติเวกเตอร์ที่มีจำนวนเต็มนับค่าไม่ซ้ำกันใช้

dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
c(table(dummyData)) # get un-dimensioned integer vector
 1  2 
25 75

str(c(table(dummyData)) ) # confirm structure
 Named int [1:2] 25 75
 - attr(*, "names")= chr [1:2] "1" "2"

สิ่งนี้อาจมีประโยชน์หากคุณต้องการป้อนจำนวนที่ไม่ซ้ำกันในฟังก์ชั่นอื่นและสั้นกว่าและมีความหมายมากกว่าการt(as.data.frame(table(dummyData))[,2]โพสต์ในความคิดเห็นต่อคำตอบของ Chase ขอขอบคุณที่ริคาร์โด้ซาโพตาที่ชี้นี้ออกมาให้ฉันที่นี่


7

มันใช้งานได้สำหรับฉัน นำเวกเตอร์ของคุณv

length(summary(as.factor(v),maxsum=50000))

ความคิดเห็น: ตั้งค่า maxsum ให้ใหญ่พอที่จะจับจำนวนค่าที่ไม่ซ้ำกัน

หรือกับmagrittrแพคเกจ

v %>% as.factor %>% summary(maxsum=50000) %>% length


4

หากคุณจำเป็นต้องมีจำนวนค่าที่ไม่ซ้ำกันเป็นคอลัมน์เพิ่มเติมในกรอบข้อมูลที่มีค่าของคุณ (คอลัมน์ซึ่งอาจเป็นตัวแทนของขนาดตัวอย่าง) plyr ให้วิธีที่เรียบร้อย:

data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))

library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))

3
ddply(data_frame, .(v), count)หรือ นอกจากนี้มูลค่าการทำให้ชัดเจนว่าคุณต้องมีlibrary("plyr")สายเพื่อddplyทำงาน
Brian Diggs

ดูเหมือนว่าแปลกที่จะใช้transformแทนเมื่อใช้mutate plyr
Gregor Thomas

3

การทำค่านิยมให้เป็นหมวดหมู่และการเรียกsummary()ก็จะได้ผลเช่นกัน

> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
 1  2 
25 75 


0

หากคุณต้องการเรียกใช้ที่ไม่ซ้ำกันบน data.frame (เช่น train.data) และรับจำนวน (ซึ่งสามารถใช้เป็นน้ำหนักในตัวแยกประเภท) คุณสามารถทำสิ่งต่อไปนี้:

unique.count = function(train.data, all.numeric=FALSE) {                                                                                                                                                                                                 
  # first convert each row in the data.frame to a string                                                                                                                                                                              
  train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                                                                                                                                           
  # use table to index and count the strings                                                                                                                                                                                          
  train.data.str.t = table(train.data.str)                                                                                                                                                                                            
  # get the unique data string from the row.names                                                                                                                                                                                     
  train.data.str.uniq = row.names(train.data.str.t)                                                                                                                                                                                   
  weight = as.numeric(train.data.str.t)                                                                                                                                                                                               
  # convert the unique data string to data.frame
  if (all.numeric) {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) as.numeric(unlist(strsplit(x, split=","))))))                                                                                                    
  } else {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) unlist(strsplit(x, split=",")))))                                                                                                    
  }
  names(train.data.uniq) = names(train.data)                                                                                                                                                                                          
  list(data=train.data.uniq, weight=weight)                                                                                                                                                                                           
}  


-2
count_unique_words <-function(wlist) {
ucountlist = list()
unamelist = c()
for (i in wlist)
{
if (is.element(i, unamelist))
    ucountlist[[i]] <- ucountlist[[i]] +1
else
    {
    listlen <- length(ucountlist)
    ucountlist[[i]] <- 1
    unamelist <- c(unamelist, i)
    }
}
ucountlist
}

expt_counts <- count_unique_words(population)
for(i in names(expt_counts))
    cat(i, expt_counts[[i]], "\n")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.