Как разделить фрейм данных в список фреймов данных относительно имени столбца в R? - PullRequest
4 голосов
/ 14 февраля 2012

Предположим, у меня есть следующий фрейм данных:

df <- data.frame(BR.a=rnorm(10), BR.b=rnorm(10), BR.c=rnorm(10),
USA.a=rnorm(10), USA.b = rnorm(10), FRA.a=rnorm(10), FRA.b=rnorm(10))

Я хочу создать список фреймов данных, разделяя их по первой части имени столбца, т. Е. Столбцы, начинающиеся с "BR", будутбыть одним элементом списка, столбцы, начинающиеся с «USA», будут другими, и т. д.

Я могу получить имена столбцов и разделить их, используя strsplit.Однако я не уверен, как будет лучшим способом перебрать его и отделить фрейм данных.

strsplit(names(df), "\\.")

дает мне список, в котором элементами верхнего уровня являются имена столбцов, а вторым уровнемэто то же самое, разделенное на ".".

Как я могу выполнить итерацию этого списка, чтобы получить порядковый номер столбцов, начинающихся с одной и той же подстроки, и сгруппировать эти столбцы как элементы другого списка?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Дейсон побеждает меня в этом, но вот другая разновидность того же концептуального подхода:

library(plyr)

# Use regex to get the prefixes
# Pulls any letters or digits ("\\w*") from the beginning of the string ("^")
# to the first period ("\\.") into a group, then matches all the remaining
# characters (".*").  Then replaces with the first group ("\\1" = "(\\w*)").
# In other words, it matches the whole string but replaces with only the prefix.

prefixes <- unique(gsub(pattern = "^(\\w*)\\..*",
                        replace = "\\1",
                        x = names(df)))

# Subset to the variables that match the prefix
# Iterates over the prefixes and subsets based on the variable names that
# match that prefix
llply(prefixes, .fun = function(x){
    y <- subset(df, select = names(df)[grep(names(df),
                                            pattern = paste("^", x, sep = ""))])
})

Я думаю, что эти регулярные выражения все равно должны дать вам правильные результаты, даже если есть "."позже в именах переменных:

unique(gsub(pattern = "^(\\w*)\\..*",
            replace = "\\1",
            x = c(names(df), "FRA.c.blahblah")))

Или, если префикс появляется позже в имени переменной:

# Add a USA variable with "FRA" in it
df2 <- data.frame(df, USA.FRANKLINS = rnorm(10))

prefixes2 <- unique(gsub(pattern = "^(\\w*)\\..*",
                        replace = "\\1",
                        x = names(df2)))

llply(prefixes2, .fun = function(x){
    y <- subset(df2, select = names(df2)[grep(names(df2),
                                            pattern = paste("^", x, sep = ""))])
})
3 голосов
/ 14 февраля 2012

Это будет работать только в том случае, если имена столбцов всегда находятся в той форме, в которой они есть (разделены на основе "."), И вы хотите сгруппировать на основе идентификатора перед первым ".".

df <- data.frame(BR.a=rnorm(10), BR.b=rnorm(10), BR.c=rnorm(10),
USA.a=rnorm(10), USA.b = rnorm(10), FRA.a=rnorm(10), FRA.b=rnorm(10))

## Grab the component of the names we want
nm <- do.call(rbind, strsplit(colnames(df), "\\."))[,1]
## Create list with custom function using lapply
datlist <- lapply(unique(nm), function(x){df[, nm == x]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...