2014-10-03 3 views
0

У меня есть один фрейм данных, содержащий столбцы, которые я хочу посмотреть по отдельности. Я не уверен, какой общий метод предназначен для анализа данных отдельно, но я хочу создать отдельный кадр переменной/данных для каждого столбца в моем исходном фрейме данных. Я знаю, что могу подмножить, но есть ли способ использовать цикл for (это самый простой способ?), Чтобы создать x новых переменных из столбцов x в моем кадре данных?Создать переменную из каждого столбца в кадре данных

Для получения более подробной информации о моем фрейме данных, у меня есть продукт и соответствующий индекс (с которым продукт судится).

Пример кадр данных:

Date   Product 1  Index 1  Product 2  Index 2 
1/1/1995  2.89  2.75   4.91   5.01 
2/1/1995  1.38  1.65   3.47   3.29 

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

+1

Я не понимаю, почему вы хотели бы это сделать. Либо используйте индексирование, такое как 'd $ Date',' d $ \ 'Product 1 \' 'и т. Д. Или используйте' attach' (который я не рекомендую). – juba

+2

'list2env (data, .GlobalEnv)' может быть тем, что вы хотите. Он отправляет столбцы в глобальную среду, каждая из которых является своей собственной переменной. –

+0

@ user2662565 Если вы можете хранить пары имен переменных в списке, вы можете сделать: 'indx <- gsub (" [^ 0-9] + "," ", colnames (dat) [- 1]); lst1 <- lapply (split (seq_along (dat [, - 1]), indx), function (i) colnames (dat [, - 1] [, i])) 'где' dat' - ваш набор данных. Тогда вы можете использовать 'list2env', как предложил Ричард Скривен. то есть 'list2env (setNames (lst1, paste (« Product_Index », имена (lst1), sep =« _ »)), envir = .GlobalEnv); Product_Index_1' – akrun

ответ

1

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

df <- data.frame(x=1:10, y=11:20, z=21:30) 

for (i in colnames(df)) { 
    assign(i, df[, i]) 
} 
1

Вы могли бы индексировать столбцы и поместить их в новый список с каждым элементом, содержащим пару продукта/индексом и столбец даты.

ind <- seq(2, by = 2, length.out = ncol(dat[-1])/2) 
(sets <- lapply(ind, function(i) dat[c(1, i:(i+1))])) 
# [[1]] 
#  Date Product1 Index1 
# 1 1/1/1995  2.89 2.75 
# 2 2/1/1995  1.38 1.65 
# 
# [[2]] 
#  Date Product2 Index2 
# 1 1/1/1995  4.91 5.01 
# 2 2/1/1995  3.47 3.29 

Если вы хотите, вы можете назначить эти кадры данных в глобальной среде с list2env

list2env(setNames(sets, paste0("Set", seq_along(sets))), .GlobalEnv) 
Set1 
#  Date Product1 Index1 
# 1 1/1/1995  2.89 2.75 
# 2 2/1/1995  1.38 1.65 
Set2 
#  Date Product2 Index2 
# 1 1/1/1995  4.91 5.01 
# 2 2/1/1995  3.47 3.29 

данных:

dat <- 
structure(list(Date = structure(1:2, .Label = c("1/1/1995", "2/1/1995" 
), class = "factor"), Product1 = c(2.89, 1.38), Index1 = c(2.75, 
1.65), Product2 = c(4.91, 3.47), Index2 = c(5.01, 3.29)), .Names = c("Date", 
"Product1", "Index1", "Product2", "Index2"), class = "data.frame", row.names = c(NA, 
-2L)) 
0

Это то, что делает attach. Вы можете просто сделать attach(my_data_frame).

Большинство людей, которые знают, что они делают, скажут вам, что это лежит где-то между «ненужным» и «не очень хорошим».

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