2017-02-10 17 views
0

我试图通过一个名为iter的字符串向量进行循环,以便在R中对一个数据框进行子集划分。我想在循环中使用i iter值来过滤该数据框并将其赋值到使用iter值i的变量。为循环内部设置一个数据集

iter<- c(COD1,COD2,COD3) 

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

该命令的输出将是3个变量,它们是数据帧。我感兴趣的是一列名为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和它的子集的变量分配到一个新的变量的出现错误:

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") 
} 

当我尝试从使用i [,“mu.spline”]的每个变量中获取名为mu.spline的列时,似乎会出现问题。我不知道为什么怎么一回事,因为我tryed这种方式得到一个循环外列(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

这是一般不建议在R.使用assign是该功能可用,但不建议使用它。我相信你所看到的结果可以以更简单的方式生成。
lapply命令执行与上述for循环相同的功能。

#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很新,并且很容易计算出我想要使用的东西以及变量的方式。这个deffinetly的作品,并避免使用迭代,导致在非复杂任务失败..:/我会尝试使用'lapply()'进一步的任务,如appi shapiro测试每个这些子集:) – 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所有值的数字向量。我想要做的是获取一个数值向量,其中包含for循环中每个数据子集的mu.spline值。我尝试了我在向量中的[[mu.spline]],但是我遇到了那个导致上述错误的问题:( – Neuls

+0

我添加了一个选项来在'for'循环中使用数据 – Wietze314

+0

根据我的数据分割我的数据并打印所需的一套mu.spline内循环它worrks,所以我试图做'for(l in lst){assign(paste0(l,“。mu”),l $ mu.spline)}试图存储这个值在排序变量中,但每次迭代R都显示了赋值行中的sam错误:只有第一行被用作变量,我得到了一堆存储的值,它们似乎是为您调整的矢量 – Neuls