Считайте вхождения группы в R-кадров данных [дубликат]

Мне нравится анализировать HTML с регулярными выражениями. Я не пытаюсь разбирать идиот HTML, который намеренно нарушен. Этот код является моим основным парсером (версия Perl):

$_ = join "",; tr/\n\r \t/ /s; s//>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print

Он называется htmlsplit, разбивает HTML на строки, с одним тегом или фрагментом текста в каждой строке. Затем линии могут быть обработаны другими текстовыми инструментами и сценариями, такими как grep , sed , Perl и т. Д. Я даже не шучу :) Наслаждайтесь.

Достаточно просто переписать мой скрипт Perl-all-first Perl в приятную поточную вещь, если вы хотите обрабатывать огромные веб-страницы. Но это действительно не обязательно.

Бьюсь об заклад, я заберусь для этого.

HTML Split


Против моего ожидая, что это получило некоторые upvotes, поэтому я предлагаю несколько правильных выражений:

/(<.*?>|[^<]+)\s*/g    # get tags and text
/(\w+)="(.*?)"/g       # get attibutes

Они хороши для XML / XHTML.

С небольшими вариациями он может справиться с беспорядочным HTML ... или сначала конвертировать HTML -> XHTML.


Лучший способ записи регулярных выражений - в Lex / Yacc стиль, а не непрозрачные однострочные или прокомментированные многострочные чудовища. Я не делал этого здесь; эти им едва ли нужны.

76
задан Henrik 29 January 2017 в 11:58
поделиться

11 ответов

Существует также df2 <- count(x, c('Year','Month')) (пакет plyr)

37
ответ дан geotheory 15 August 2018 в 14:32
поделиться
  • 1
    Есть ли способ агрегировать переменную и делать подсчет тоже (например, 2 функции в агрегировании: среднее + количество)? Мне нужно получить среднее значение столбца и количество строк для одного и того же значения в другом столбце – sop 15 May 2015 в 14:06
  • 2
    Я cbind получил результаты aggregate(Sepal.Length ~ Species, iris, mean) и aggregate(Sepal.Length ~ Species, iris, length) – geotheory 16 May 2015 в 22:28
  • 3
    Я сделал это, но кажется, что я получаю 2 раза за каждый столбец, кроме агрегированного; поэтому я сделал слияние на них, и, похоже, все в порядке – sop 18 May 2015 в 07:20
  • 4
    Я не знаю, но это тоже может быть полезно ... df %>% group_by(group, variable) %>% mutate(count = n()) – Manoj Kumar 14 December 2016 в 18:57
  • 5
    Да dplyr - лучшая практика. – geotheory 15 December 2016 в 03:07

Следуя предложению Джошуа, вы можете подсчитать количество наблюдений в вашем фрейме df, где Year = 2007 и Month = Nov (если они столбцы):

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])

и с aggregate, следуя @GregSnow:

aggregate(x ~ Year + Month, data = df, FUN = length)
51
ответ дан Ben 15 August 2018 в 14:32
поделиться

Альтернативой функции aggregate() в этом случае будет table() с as.data.frame(), что также укажет, какие комбинации Год и Месяц связаны с нулевыми вхождениями

df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11))

myAns<-as.data.frame(table(df[,c("year","month")]))

И без нулевых комбинаций

myAns[which(myAns$Freq>0),]
14
ответ дан BenBarnes 15 August 2018 в 14:32
поделиться

Создайте новую переменную Count со значением 1 для каждой строки:

df1["Count"] <-1

Затем скомпилируйте фрейм данных, суммируя по столбцу Count:

df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)
16
ответ дан David Arenburg 15 August 2018 в 14:32
поделиться

Простой вариант использования с aggregate - это функция length, которая даст вам длину вектора в подмножестве. Иногда немного более надежным является использование function(x) sum( !is.na(x) ).

20
ответ дан Greg Snow 15 August 2018 в 14:32
поделиться

Мы также можем использовать dplyr.

Во-первых, некоторые данные:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))

Теперь число:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)

Мы также можем используйте немного более длинную версию с трубкой и функцию n():

df %>% 
  group_by(year, month) %>%
  summarise(number = n())

или функцию `tally:

df %>% 
  group_by(year, month) %>%
  tally()
27
ответ дан Jaap 15 August 2018 в 14:32
поделиться

Решение с использованием пакета sqldf:

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")
1
ответ дан Masoud 15 August 2018 в 14:32
поделиться

Для моих скоплений я обычно получаю желание видеть среднее и «насколько велика эта группа» (длина a.k.a.). Так что это мой удобный фрагмент для этих случаев:

agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean")
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length")
aggcount <- agg.count$columnToMean
agg <- cbind(aggcount, agg.mean)
3
ответ дан maze 15 August 2018 в 14:32
поделиться

Старый вопрос без решения data.table. Итак, здесь идет ...

Используя .N

library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
25
ответ дан mnel 15 August 2018 в 14:32
поделиться
lw<- function(x){length(which(df$variable==someValue))}

agg<- aggregate(Var1~Var2+Var3, data=df, FUN=lw)

names(agg)<- c("Some", "Pretty", "Names", "Here")

View(agg)
-1
ответ дан nate 15 August 2018 в 14:32
поделиться

Учитывая ответ @Ben, R выдает ошибку, если df1 не содержит столбец x. Но это можно решить элегантно с помощью paste:

aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW)

Аналогичным образом его можно обобщить, если в группировке используется более двух переменных:

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)
0
ответ дан paudan 15 August 2018 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: