2016-03-30 3 views
1

у меня есть ФР, как это состояло из 1 колонки на ColName Var1Количество вхождений факторов

df <- read.table(text = "Var1 
|12|24|22|1|4 
|12|23|22|1|445 
|12|22|22|1|4 
|101|116 
|101|116|116|174 
|101|116|125|174 
|101|116|150|174 
|101|116|156 
|101|116|156|174 
|101|116|162", header = TRUE, stringsAsFactors = FALSE) 

Вопросы:

  1. Как я могу рассчитывать на возникновение этого | 22 | ?
  2. Как посчитать число вхождений | 22 | как 1 вхождение, только если оно повторяется более одного раза в определенной строке. пример в 3-й строке | 22 | повторяется дважды, я хочу, чтобы R считал его равным 1.
+0

могли бы вы предоставить рабочий пример ваших данных, пожалуйста? – elbaulp

+0

Что, если 22 на конце? '| 22' –

ответ

5

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

df <- as.matrix(read.table(text = "|12|24|22|1|4 
|12|23|22|1|445 
|12|22|22|1|4 
|101|116 
|101|116|116|174 
|101|116|125|174 
|101|116|150|174 
|101|116|156 
|101|116|156|174 
|101|116|162", fill = TRUE, sep = "|"))  

sum(df == 22, na.rm = TRUE) 
# [1] 4 
(rowSums(df == 22, na.rm = TRUE) > 0) + 0 
# [1] 1 1 1 0 0 0 0 0 0 0 
sum(rowSums(df == 22, na.rm = TRUE) > 0) 
# [1] 3 

В качестве альтернативы, вы можете также конвертировать вам оригинальную df в data.table и использовать tstrsplit функцию

df <- read.table(text = "Var1 
       |12|24|22|1|4 
       |12|23|22|1|445 
       |12|22|22|1|4 
       |101|116 
       |101|116|116|174 
       |101|116|125|174 
       |101|116|150|174 
       |101|116|156 
       |101|116|156|174 
       |101|116|162", header = TRUE) 

library(data.table) 
DT <- setDT(df)[, tstrsplit(Var1, "|", fixed = TRUE)] 
DT[, sum(.SD == 22, na.rm = TRUE)] 
# [1] 4 
DT[, sum(rowSums(.SD == 22, na.rm = TRUE) > 0)] 
# [1] 3 
+0

Блестящий Дэвид, у меня была эта мысль, но не отвага, чтобы сделать это, поскольку я новичок все еще –

5
DF <- read.table(text = "Var1 
       |12|24|22|1|4 
       |12|23|22|1|445 
       |12|22|22|1|4 
       |101|116 
       |101|116|116|174 
       |101|116|125|174 
       |101|116|150|174 
       |101|116|156 
       |101|116|156|174 
       |101|116|162", header = TRUE, stringsAsFactors = FALSE) 
x <- strsplit(DF$Var1, "|", fixed = TRUE) 
sum(unlist(x) == "22") 
#[1] 4 
sum(sapply(x, function(s) "22" %in% s)) 
#[1] 3 
+0

Привет, Роланд, можете ли вы объяснить stringAsFactors = false? это читать данные, поскольку строки не являются факторами? –

+1

Точно. См. 'Help (" read.table ")'. – Roland

2

Это легко с регулярным выражением

sum(grepl("\\|22(\\||$)", df$Var1)) 
+0

22, за которым следует труба или конец –

+0

ОП попросил | 22 |. Не | 22 в конце. – Thierry

+0

Правда. Это непонятно. Вы можете вернуться к редактированию, которое вы хотите. –

1

Пожалуйста, пост repoducible пример в следующий раз.

Вы можете сделать это, используя регулярное выражение с grepl. С ФР как ваш data.frame

length(df[grepl('|22|',df$Var, fixed=T),]) 

Это ответить на ваш второй вопрос, и может быть легко адаптированы для Q 1.

Смежные вопросы