【问题标题】:R loop (or apply) that creates separate dataframes via subset [duplicate]R循环(或应用)通过子集创建单独的数据帧[重复]
【发布时间】:2022-11-22 04:12:45
【问题描述】:

我有这个示例数据框。

df <- data.frame (MARKET  = c("US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil", "US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil"),
                  MEAL = c("Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast")
)

我想创建单独的数据框子集,其中包含膳食和市场的每种组合(即 Brazil_Breakfast、Brazil_Lunch、Brazil_Dinner 等)。

我在这里从每个变量中获取行名称。

markets <- rownames(table(df$MARKET))
meals <- rownames(table(df$MEAL))

我知道我可以像这样子集其中之一

brazil_breakfast <- subset(df, MARKET==markets[1] & MEAL==meals[1])

但我希望能够自动执行此操作。这是我起草的 for 循环的草稿。

for (i in length(markets)) {
  for (j in length(meals)) {
    i_j <- subset(df, MARKET==markets[i] & MEAL==meals[j]) 
  }
}

但这只会创建最后一个组合,即 US 和 Lunch,实际上它的字面意思是 i_j。

如何在 for 循环中创建一个单独的新数据帧?也很高兴使用 apply 语句。

谢谢!

【问题讨论】:

  • 你需要split,比如df_list = split(df, df[c("MARKET", "MEAL")])。如果你真的想要它们在全局环境中,你可以使用list2env(df_list),但在大多数情况下,你最好将它们保存在list中(或者根本不拆分它们......不确定你为什么要这样做这样做,但你可以做到很多“按组”与dplyrdata.table

标签: r for-loop apply lapply


【解决方案1】:

IIUC 这应该做的:

df <- data.frame (MARKET  = c("US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil", "US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil","US", "US", "UK", "UK", "China", "China", "Brazil", "Brazil"),
                  MEAL = c("Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner","Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast", "Lunch", "Dinner", "Breakfast"),
                  value = 1:40)
)


nes = df %>% group_split(MARKET, MEAL)


# <list_of<
#   tbl_df<
#   MARKET: factor<76aa3>
#   MEAL  : factor<4f900>
#   value : integer
# >
#   >[12]>
#   [[1]]
# # A tibble: 4 × 3
# MARKET MEAL      value
# <fct>  <fct>     <int>
#   1 Brazil Breakfast     7
# 2 Brazil Breakfast    16
# 3 Brazil Breakfast    31
# 4 Brazil Breakfast    40
# 
# [[2]]
# # A tibble: 3 × 3
# MARKET MEAL   value
# <fct>  <fct>  <int>
#   1 Brazil Dinner    15
# 2 Brazil Dinner    24
# 3 Brazil Dinner    39
# 
# [[3]]
# # A tibble: 3 × 3
# MARKET MEAL  value
# <fct>  <fct> <int>
#   1 Brazil Lunch     8
# 2 Brazil Lunch    23
# 3 Brazil Lunch    32


.
.
.

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2019-01-02
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2013-05-05
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多