Работа с функцией rep () - PullRequest
3 голосов
/ 30 июня 2011

Я использую функцию rep(), чтобы повторять каждый элемент в строке несколько раз.Каждый имеющийся у меня символ содержит информацию о состоянии, и мне нужно, чтобы первые три элемента вектора символов повторялись три раза, а четвертый элемент повторялся пять раз.

Итак, допустим, у меня есть следующие векторы символов.

al <- c("AlabamaCity", "AlabamaCityST", "AlabamaCityState", "AlabamaZipCode") 
ak <- c("AlaskaCity", "AlaskaCityST", "AlaskaCityState", "AlaskaZipCode")
az <- c("ArizonaCity", "ArizonaCityST", "ArizonaCityState", "ArizonaZipCode")
ar <- c("ArkansasCity", "ArkansasCityST", "ArkansasCityState", "ArkansasZipCode")

Я хочу получить следующий вывод:

AlabamaCity
AlabamaCity
AlabamaCity
AlabamaCityST
AlabamaCityST
AlabamaCityST
AlabamaCityState
AlabamaCityState
AlabamaCityState
AlabamaZipCode
AlabamaZipCode
AlabamaZipCode
AlabamaZipCode
AlabamaZipCode
AlabamaZipCode
...

Мне удалось получить желаемый результат с помощью следующей команды, но это немного неудобно, когда я бегучерез все пятьдесят штатов.Кроме того, у меня может быть другой столбец с 237 городами в Алабаме, и я неизбежно столкнусь с проблемами при сопоставлении имен в первом столбце со значениями во втором столбце.

   dat = data.frame(name=c(rep(al[1:3],each=3), rep(al[4],each=6), 
                rep(ak[1:3],each=3), rep(ak[4],each=6)))
   dat


   dat2 = data.frame(name=c(rep(al[1:3],each=3), rep(al[4],each=6), 
                rep(ak[1:3],each=3), rep(ak[4],each=6)),
                city=c(rep("x",each=15), rep("y",each=15)))
   dat2

Конечно, вВ реальной жизни x и y не будут единичными значениями.

Так что мой вопрос касается более эффективного способа выполнения этой задачи.И тесно связан с вопросом, когда становится важным отказаться от процедурного программирования в пользу ООП в R. (не программист, так что вторая часть может быть действительно глупым вопросом) Более важно, это задача, на которую я должен смотретьдля решения проблемы.

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

Согласно ?rep, times= может быть вектором.Итак, как насчет этого:

dat <- data.frame(name=rep(al, times=c(3,3,3,6)))

Было бы также более удобно, если бы ваши «данные о состоянии» были в списке.

stateData <- list(al,ak,az,ar)
Data <- lapply(stateData, function(x) data.frame(name=rep(x, times=c(3,3,3,6))))
Data <- do.call(rbind, Data)
2 голосов
/ 30 июня 2011

Вы можете использовать expand.grid, а затем вставить результаты из этого.

2 голосов
/ 30 июня 2011

Я думаю, что вы можете объединить аргумент times() rep для работы со списком с sapply(). Итак, во-первых, нам нужно сделать наш список объектов:

vars <- list(al, ak, az, ar)


# Iterate through each object in vars. By default, this returns a column for each list item.
# Convert to vector and then to data.frame...This is probably not that efficient.
as.data.frame(as.vector(sapply(vars, function(x) rep(x, times = c(3,3,3,6)))))

1                                                         AlabamaCity
2                                                         AlabamaCity
3                                                         AlabamaCity
4                                                       AlabamaCityST
....snip....
....snip....
57                                                    ArkansasZipCode
58                                                    ArkansasZipCode
59                                                    ArkansasZipCode
60                                                    ArkansasZipCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...