Мне нравится анализировать HTML с регулярными выражениями. Я не пытаюсь разбирать идиот HTML, который намеренно нарушен. Этот код является моим основным парсером (версия Perl):
$_ = join "",; tr/\n\r \t/ /s; s/\n/>\n/g; s/\n ?\n/\n/g;
s/^ ?\n//s; s/ $//s; print
Он называется htmlsplit, разбивает HTML на строки, с одним тегом или фрагментом текста в каждой строке. Затем линии могут быть обработаны другими текстовыми инструментами и сценариями, такими как grep , sed , Perl и т. Д. Я даже не шучу :) Наслаждайтесь.
Достаточно просто переписать мой скрипт Perl-all-first Perl в приятную поточную вещь, если вы хотите обрабатывать огромные веб-страницы. Но это действительно не обязательно.
Бьюсь об заклад, я заберусь для этого.
Против моего ожидая, что это получило некоторые upvotes, поэтому я предлагаю несколько правильных выражений:
/(<.*?>|[^<]+)\s*/g # get tags and text
/(\w+)="(.*?)"/g # get attibutes
Они хороши для XML / XHTML.
С небольшими вариациями он может справиться с беспорядочным HTML ... или сначала конвертировать HTML -> XHTML.
Лучший способ записи регулярных выражений - в Lex / Yacc стиль, а не непрозрачные однострочные или прокомментированные многострочные чудовища. Я не делал этого здесь; эти им едва ли нужны.
Существует также df2 <- count(x, c('Year','Month'))
(пакет plyr)
Следуя предложению Джошуа, вы можете подсчитать количество наблюдений в вашем фрейме df
, где Year
= 2007 и Month
= Nov (если они столбцы):
nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])
и с aggregate
, следуя @GregSnow:
aggregate(x ~ Year + Month, data = df, FUN = length)
Альтернативой функции 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),]
Создайте новую переменную Count
со значением 1 для каждой строки:
df1["Count"] <-1
Затем скомпилируйте фрейм данных, суммируя по столбцу Count
:
df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)
Простой вариант использования с aggregate
- это функция length
, которая даст вам длину вектора в подмножестве. Иногда немного более надежным является использование function(x) sum( !is.na(x) )
.
Мы также можем использовать 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()
Решение sql с использованием пакета sqldf
:
library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
FROM df1
GROUP BY Year, Month")
Для моих скоплений я обычно получаю желание видеть среднее и «насколько велика эта группа» (длина 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)
Старый вопрос без решения data.table
. Итак, здесь идет ...
Используя .N
library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
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)
Учитывая ответ @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)
cbind
получил результатыaggregate(Sepal.Length ~ Species, iris, mean)
иaggregate(Sepal.Length ~ Species, iris, length)
– geotheory 16 May 2015 в 22:28df %>% group_by(group, variable) %>% mutate(count = n())
– Manoj Kumar 14 December 2016 в 18:57