2017-02-10 11 views
0

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

iter<- c(COD1,COD2,COD3) 

    for (i in iter) { 
     assign(i, subset(out,TestId==paste0(i) & AddId=="Curva_F_Cor")) 
    } 

Результатом этой команды будет 3 переменные, которые являются dataframes. Я заинтересован в колонке под названием mu.spline, который присутствует в этих 3-х переменных:

TestID mu.spline lambda.spline 
COD1  0.02  3 
COD1  0.03  4 
COD1  0.01  1 

TestID mu.spline lambda.spline 
COD2  0.1   8 
COD2  0.25  10 
COD2  0.01  3 

TestID mu.spline lambda.spline 
COD3  0.12  1 
COD3  0.32  8 
COD3  0.22  3 

Однако, если я хочу, чтобы получить столбец с именем mu.spline и присвоить его новой переменной от subseted переменных ошибка:

for (i in iter) { 
    assign(i, subset(out,TestId==paste0(i) & AddId=="Curva_F_Cor")) 
    assign(paste0(i,".mu"), i[,"mu.spline"]) 
} 

Выход:

Error in i[, "mu.spline"] : incorrect number of dimensions 

Если я попробовать следующий код, итерация работает:

for (i in iter) { 
    assign(i, subset(out,TestId==paste0(i) & AddId=="Curva_F_Cor")) 
    i 
    assign(paste0(i,".mu"), "hi") 
} 

Похоже, проблема возникает, когда я пытаюсь получить столбец с именем mu.spline из каждой переменной с помощью i [, "mu.spline"]. Интересно, почему он не beacuse я судимый таким образом получая столбцы (COD1[,"mu.spline"]) вне цикла, и она работала ...

** Редактировать для dput():

structure(list(TestId = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 
3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 8L, 8L, 
8L, 9L, 9L, 9L, 10L, 10L, 10L, 11L, 11L, 11L, 12L, 12L, 12L, 
13L, 13L, 13L, 14L, 14L, 14L, 15L, 15L, 15L, 16L, 16L, 16L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L), .Label = c("Comb1", 
"Comb2", "COD1", "COD2", "COD3", "COD4", "COD5", 
"COD6", "COD7", "COD8", "COD9", "COD10", "COD11", 
"COD12", "COD13", "COD14", "Pat"), class = "factor"), 
    mu.spline = c(0.156373645710651, 0.128179004733465, 0.133922208832118, 
    0.0968325365246728, 0.112497378553166, 0.108787192266453, 
    0.110192954818258, 0.121005105680758, 0.0980394197157738, 
    0.138420857616108, 0.127789639429687, 0.128560390185466, 
    0.110549423439033, 0.108320566548023, 0.098918312107995, 
    0.0828284492044932, 0.104197889210497, 0.122413067260436, 
    0.100261893863431, 0.0938211089313908, 0.0950013179641027, 
    0.145680825059066, 0.139104408376977, 0.126037019624304, 
    0.126708418382696, 0.129821223842992, 0.136480998324424, 
    0.13593684872676, 0.139066913195263, 0.148222162331793, 0.1063086971118, 
    0.167178433353777, 0.0999504815546864, 0.159110219357191, 
    0.125081233896366, 0.163966026506179, 0.15029944955429, 0.116975580695436, 
    0.15276496804095, 0.155339014181045, 0.112171217970295, 0.120104234834245, 
    0.133373734309075, 0.175784287024805, 0.133626401899954, 
    0.140297143337283, 0.0863206151811713, 0.170070971923806, 
    0.152896880973888, 0.10553437562759, 0.124122727198564, 0.163571762302165, 
    0.151047108367937, 0.131416085292366, 0.152515440225195, 
    0.139308623745812, 0.146009754853497, 0.170825235429307, 
    0.147466868348918, 0.126623691613807, 0.147114348605148, 
    0.141084369853073, 0.153670399861141, 0.162948873362462, 
    0.131121302899353, 0.146421599771427, 0.135166111999851, 
    0.157495164357944, 0.126927329131488, 0.159831796004744, 
    0.146936913846553, 0.12183336770971, 0.136669798817364, 0.152333836640196, 
    0.138055091325892)), .Names = c("TestId", "mu.spline"), row.names = c("76", 
"77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", 
"88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", 
"99", "100", "101", "102", "103", "104", "105", "106", "107", 
"108", "109", "110", "111", "112", "113", "114", "115", "116", 
"117", "118", "119", "120", "121", "122", "123", "124", "125", 
"126", "127", "128", "129", "130", "131", "132", "133", "134", 
"135", "136", "137", "138", "139", "140", "141", "142", "143", 
"144", "145", "146", "147", "148", "149", "150"), class = "data.frame") 
+0

Просьба предоставить минимальные данные об образцах. – epi99

+0

Добавлен образец данных, надеюсь, он поможет – Neuls

ответ

0

Это, как правило, не рекомендуется использовать assign в R. Да функция но его использование не рекомендуется. Я считаю, что результаты, которые вы ищете, могут быть сгенерированы гораздо проще.
Команда lapply выполняет ту же функцию, что и выше для циклов.

#out<- #your dataframe of data 

#define an array of string valuse 
iter<-c("COD1", "COD2", "COD3") 
#create a list of dataframes of the subsets 
ans<-lapply(iter, function(x) {subset(out, TestId==x)}) 
#rename the list elements 
names(ans)<-iter 

#to access each subset any of the listed methods: 
ans[[1]] 
ans["COD1"] 
ans$COD1 
ans[iter[1]] 
+0

Я много читал о функции lapply(), а также о том, что назначение не было хорошей практикой. Я довольно новичок в R, и мне было легче рисовать материал, который я хотел использовать, используя и переменную . Это эффективно работает и позволяет избежать использования итераций, которые привели к сбою при выполнении неосложненных задач.:/Я буду пытаться использовать 'lapply()' в следующих задачах, таких как aplying test для каждого из этих подмножеств :) – Neuls

0

Я сделал пример список (lst), и используйте do.call(rbind), чтобы сделать его в data.frame, из которого легко извлечь желаемый столбец.

str <- ' 
TestID mu.spline lambda.spline 
COD1  0.02  3 
COD1  0.03  4 
COD1  0.01  1 
COD2  0.1   8 
COD2  0.25  10 
COD2  0.01  3 
COD3  0.12  1 
COD3  0.32  8 
COD3  0.22  3 ' 

file <- textConnection(str) 

raw <- read.table(file, header = T) 

lst <- split(raw,raw$TestID) 

> lst 
$COD1 
    TestID mu.spline lambda.spline 
1 COD1  0.02    3 
2 COD1  0.03    4 
3 COD1  0.01    1 

$COD2 
    TestID mu.spline lambda.spline 
4 COD2  0.10    8 
5 COD2  0.25   10 
6 COD2  0.01    3 

$COD3 
    TestID mu.spline lambda.spline 
7 COD3  0.12    1 
8 COD3  0.32    8 
9 COD3  0.22    3 

получить колонку вы хотите:

do.call(rbind, lst)$mu.spline 

или получить доступ к данным в цикле:

for(l in names(lst)) 
{ 
    assign(l,lst[[l]]$mu.spline) 
} 
+0

Я попытался использовать ваш вариант, но он дал числовой вектор, содержащий все значения mu.spline. что я пытаюсь сделать, это получить числовой вектор, содержащий значения mu.spline каждого подмножества данных внутри цикла for. Я попробовал i [, «mu.spline»] внутри вектора, но theres беспокоит проблему с этим i, что приводит к ошибке, описанной выше :( – Neuls

+0

Я добавил возможность использовать данные в цикле 'for' – Wietze314

+0

Разделение данных в соответствии с и печатать желаемый набор mu.spline внутри цикла, который это вызывает, поэтому я пытался сделать 'for (l in lst) {присваивать (paste0 (l,". mu "), l $ mu.spline)}, чтобы попытаться сохранить это значения в отсортированных переменных, но каждая итерация R отображает ошибку sam в строке назначения: в качестве переменной используется только первая строка. Я получил кучу сохраненных значений, которые, по-видимому, соответствуют векторам – Neuls