【问题标题】:Create multiple data frames from one based off values with a for loop使用 for 循环从一个基于值的值创建多个数据框
【发布时间】:2023-04-08 01:38:01
【问题描述】:

我有一个大数据框,我想使用 for 循环将其转换为较小的子集数据框。我希望新数据框基于大/父数据框的列中的值。这是一个例子

x<- 1:20
y <- c("A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","C","C","C")
df <- as.data.frame(cbind(x,y))

好的,现在我想要三个数据框,一个是 x 和 y 列,但只有 y == "A",第二个是 y== “B”等。所以最终结果将是 3 个新的数据帧 df.A、df.B 和 df.C。我意识到这在 for 循环之外很容易做到,但我的实际数据有很多 y 级别,所以使用 for 循环(或类似的)会很好。

谢谢!

【问题讨论】:

  • 您能否举一个您的数据示例,以便我们查看所有级别?通常,在大多数情况下,这种子集可以在循环外部完成。
  • 我将从正确创建数据框开始。 df &lt;- data.frame(x, y)。您所做的方式使第一列成为因素。

标签: r for-loop dataframe


【解决方案1】:

如果你想在循环中创建单独的对象,你可以使用assign。我用unique是因为你说你有很多关卡。

 for(i in unique(df$y)) {
        nam <- paste("df", i, sep = ".")
        assign(nam, df[df$y==i,])
        }

> df.A
  x y
1 1 A
2 2 A
3 3 A
4 4 A
5 5 A
6 6 A
7 7 A
8 8 A
> df.B
    x y
9   9 B
10 10 B
11 11 B
12 12 B
13 13 B
14 14 B

【讨论】:

  • 这样就可以了。谢谢!
  • 现在,如果我想将这些数据帧的每个结果转换为空间点数据帧 SpatialPoints(),我可以在这个循环中还是在另一个循环中执行此操作?
【解决方案2】:

我认为你只需要split 函数:

 split(df, df$y)
$A
  x y
1 1 A
2 2 A
3 3 A
4 4 A
5 5 A
6 6 A
7 7 A
8 8 A

$B
    x y
9   9 B
10 10 B
11 11 B
12 12 B
13 13 B
14 14 B
15 15 B
16 16 B
17 17 B

$C
    x y
18 18 C
19 19 C
20 20 C

只需对输出进行适当的子集化以拆分并将结果存储到 dfA &lt;- split(df, df$y)[[1]]dfB &lt;- split(df, df$y)[[2]] 等对象中。

【讨论】:

  • 拆分函数可能是要走的路,但我很想避免创建所有 dfA、dfB.... 因为我的真实数据有很多级别。开始像 for (1=i in unique(df$y)){
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多