Написание функции в R - PullRequest
2 голосов
/ 16 марта 2020

Я делаю упражнение, чтобы попрактиковаться в написании функций.

Я пытаюсь выяснить общий код, прежде чем писать функцию, которая воспроизводит выходные данные функции table. Пока у меня есть следующее:

set.seed(111) 
vec <- as.integer(runif(10, 5, 20)) 

x <- sort(unique(vec))

for (i in x) {
   c <- length(x[i] == vec[i]) 
   print(c) 
}

Но это дает мне следующий вывод:

[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1

Я не думаю, что правильно поднастроил в своем l oop , Я смотрел видео, но я не совсем уверен, где я иду не так. Буду признателен за любую информацию!

Спасибо!

Ответы [ 3 ]

4 голосов
/ 16 марта 2020

Мы можем sum логический вектор объединить его в count

count <- c()
for(number in x) count <- c(count, sum(vec == number)) 
count
#[1] 3 1 4 1 5 4 3 2 7

В операциях for l oop он циклически обрабатывает значения 'x' и не в последовательности 'x'

Если мы сделаем

for(number in x) count <- c(count, length(vec[vec == number])) 

, это также должно работать

0 голосов
/ 24 марта 2020

Вот решение без использования unique и с одним проходом через вектор (если бы R было быстрым с for циклами!):

count = list()
for (i in vec) {
  val = as.character(i)
  if (is.null(count[[val]]))
    count[[val]] = 1
  else
    count[[val]] =  count[[val]] + 1
}
unlist(count)
0 голосов
/ 16 марта 2020

Вы можете попробовать sapply + setNames для достижения того же результата, что и table, т. Е.

count <- sapply(x, function(k) setNames(sum(k==vec),k))

или

count <- sapply(x, function(k) setNames(length(na.omit(match(vec,k))),k))

, такой что

> count
1 2 3 4 5 6 7 8 9 
3 1 4 1 5 4 3 2 7 
...