【问题标题】:How to subset a data frame, apply a function with a for-loop and obtain the result with the name of each subset on it?如何对数据框进行子集化,使用 for 循环应用函数并获得带有每个子集名称的结果?
【发布时间】:2015-03-21 19:41:46
【问题描述】:

我有一个数据集,我想通过一些条件将它作为 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

【问题讨论】:

  • 究竟是什么df_list
  • 抱歉,我没有在脚本中包含它...这是我拆分数据框 df_list
  • 不用担心。使用此信息编辑问题以便其他人可以看到可能是个好主意。
  • “a”的值只是循环结束时创建的值。由于您没有通过分配索引值来存储结果,因此您只需获得最后一个。

标签: r for-loop dataframe


【解决方案1】:

尝试类似:

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&lt;-vector('list', length=length(df_list) ) 预先分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2020-12-01
    相关资源
    最近更新 更多