如何对数据帧进行子集化,应用带有for循环的函数并获取其上包含每个子集名称的结果?

时间:2015-01-22 20:56:45

标签: r for-loop dataframe

我有一个数据集,我希望通过某些条件将其作为TRT进行子集化,然后在每个条件上评估一些函数,但不是为每个子集重复函数而是为了执行for循环。问题是我想得到结果,但是上面有子集的名称,我不能这样做

这是我的脚本和结果:

df_list <- split(dataet,(dataet$TRT))
> for (i in df_list){
+         a <-  c(shapiro.test(i$FV0)$p.value)
+        print(a)
+ }
[1] 0.07373223
[1] 0.2995577
[1] 0.003565924
[1] 0.005733235
[1] 0.02378732
[1] 0.01615178
[1] 0.09363349
[1] 0.8619091

上面的问题是结果还可以,但是我无法获得那些分开的值。然后我试图用向量(a)粘贴df_list的名字,但我得到了最后的结果:

> paste(names(df_list),a)
[1] "27D 0.861909062310829" "27S 0.861909062310829"
[3] "34D 0.861909062310829" "34S 0.861909062310829"
[5] "38D 0.861909062310829" "38S 0.861909062310829"
[7] "45D 0.861909062310829" "45S 0.861909062310829"

这是我数据框的一部分:

> head(dataet)
ID     sp IND POS Temp TRT   FV0   FVf      Prop
1  1 DIPOLE   A   D  27C 27D 0.833 0.664 0.2028812
2  2 DIPOLE   A   D  27C 27D 0.843 0.622 0.2621590
3  3 DIPOLE   A   D  27C 27D 0.843 0.525 0.3772242
4  4 DIPOLE   A   D  27C 27D 0.813 0.601 0.2607626
5  5 DIPOLE   A   D  27C 27D 0.810 0.592 0.2691358
6  6 DIPOLE   A   D  27C 27D 0.845 0.663 0.2153846
> tail(dataet)
 ID     sp IND POS Temp TRT   FV0   FVf      Prop
235 285 DIPOLE   C   S  45C 45S 0.764 0.383 0.4986911
236 286 DIPOLE   C   S  45C 45S 0.772 0.411 0.4676166
237 287 DIPOLE   C   S  45C 45S 0.748 0.073 0.9024064
238 288 DIPOLE   C   S  45C 45S 0.757 0.125 0.8348745
239 289 DIPOLE   C   S  45C 45S 0.773 0.086 0.8887451
240 290 DIPOLE   C   S  45C 45S 0.772 0.188 0.7564767

1 个答案:

答案 0 :(得分:0)

尝试类似:

df_list <- split(dataet,(dataet$TRT))
res <- list()

for (i in seq_along(df_list)) {
         res[[i]] <-  c( names(df_list[i], 
                         shapiro.test(df_list[[i]]$FV0)$p.value 
                        )

                             }
res

使用循环不是一种高效的方法,但我猜你的任务是适度的。如果您需要更高的效率,可以预先分配res<-vector('list', length=length(df_list) )