Выборки на основе векторных элементов - PullRequest
0 голосов
/ 11 мая 2019

Я очень новый, извините заранее. У меня есть два вектора, один символьный вектор имен учетных записей (30) и другой символьный вектор названий продуктов (30). Наконец, у меня есть датафрейм с именами учетных записей, названиями продуктов и доходами из трех столбцов, но этот список выходит далеко за рамки 30.

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

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

account<-c("a","b",etc)

product<-c("prod_a","prod_b", etc)

for(i in 1:length(account)){

    for(i in 1:length(product)){

.....
}
}

Честно говоря, я просто очень потерянный хаха

1 Ответ

0 голосов
/ 11 мая 2019

Я думаю Я знаю, что вы пытаетесь сделать здесь.Я подозреваю, что есть веская причина, по которой вы хотите использовать структуру с перекрестными таблицами 30x30, но я также хотел бы воспользоваться возможностью, чтобы поощрить «аккуратные» данные для целей анализа.Эту ссылку можно суммировать по этим трем основным критериям, чтобы данные считались «аккуратными»:

  1. Каждая переменная образует столбец.

  2. КаждыйНаблюдение образует ряд.

  3. Каждый тип наблюдательной единицы формирует таблицу.

Тем не менее, ниже моя попытка интерпретировать и продемонстрировать, чтоЯ думаю, что вы пытаетесь достичь.

library(tidyr)

# set up some fake data to better explain
account_vec <- paste0(letters, 1:26)
product_vec <- paste0(as.character(101:126), LETTERS)
revenue_vec <- rnorm(26*26)

# permutating accounts and products to set up our fake data
df <- expand.grid(account_vec, product_vec)
names(df) <- c("accounts", "products")
df$revenue <- revenue_vec

# if this is what your data looks like currently, I would consider this fairly "tidy"


# now let's pretend there's some data we need to filter out
df <- rbind(df,
    data.frame(
        accounts = paste0("bad_account", 1:3),
        products = paste0("bad_product", 1:3),
        revenue = rnorm(3)
    )
)


# filter to just what is included in our "accounts" and "products" vectors
df <- df[df$accounts %in% account_vec, ]
df <- df[df$products %in% product_vec, ]


# spread out the products so they occupy the column values
df2 <- df %>% tidyr::spread(key="products", value="revenue")

# if you aren't familiar with the "%>%" pipe operator, the above
# line of code is equivalent to this one below:
# df2 <- tidyr::spread(df, key="products", value="revenue")

# now we have accounts as rows, products as columns, and revenues at the intersection

# we can go one step further by making the accounts our row names if we want
row.names(df2) <- df2$accounts
df2$accounts <- NULL

# now the accounts are in the row name and not in a column on their own
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...