在for循环中提取特定列和包含某些字符的其他列

lhcgjxsq  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(164)

假设 Dataframe df如下:

df <- structure(list(date = c("2021-1-1", "2021-1-2", "2021-1-3", "2021-1-4", 
"2021-1-5", "2021-1-6"), buy_price_actual = 1:6, call_price_actual = 2:7, 
    sell_price_actual = 3:8, buy_price_pred = 4:9, call_price_pred = 5:10, 
    sell_price_pred = 6:11), class = "data.frame", row.names = c(NA, 
-6L))

输出:

date buy_price_actual call_price_actual sell_price_actual buy_price_actual.1 call_price_pred sell_price_pred
1 2021-1-1 1 2 3 4 5 6
2 2021-1-2 2 3 4 5 6 7
3 2021-1-3 3 4 5 6 7 8
4 2021-1-4 4 5 6 7 8 9
5 2021-1-5 5 6 7 8 9 10
6 2021-1-6 6 7 8 9 10 11

我想在for循环中提取date列以及 * buy * 和 * sell * prices的实际值和预测值:

cols <- list(
   c("date", "buy_price_actual", "buy_price_pred"),
   c("date", "sell_price_actual", "sell_price_pred")
   )

for (col in cols){
   print(col)
}

for (col in cols){
   df1 <- df %>%
     select(col)
   print(df1)
}

输出:

Error in print.default(m, ..., quote = quote, right = right, max = max) : 
  invalid printing digits -2147483648

另一种处理方法是通过grep搜索关键字,并添加date列:

price_types <- c('buy', 'sell')
for (price_type in price_types){
   df1 <- df %>%
     select_if(grepl('date'|price_type, names(.)))
   print(df1)
}

不过,以上两种解决方案还是存在bug,如何处理呢?谢谢!

a6b3iqyw

a6b3iqyw1#

第一个循环失败是因为df1 <- df %>% select(col) %>% print(df1)中有一个额外的管道,所以表达式的计算结果是df1 <- print(select(df, col), df1),这可能不是您想要的。

for (col in cols){
  df1 <- df %>%
    select(col)
  print(df1)
}

在第二个循环中,您仍然需要构造一个有效的字符串作为grepl()的第一个参数,例如paste0()

price_types <- c('buy', 'sell')
for (price_type in price_types){
  df1 <- df %>%
    select_if(grepl(paste0('date|',price_type), names(.)))
  print(df1)
}

不过,我更愿意用这样的话来代替:
一个二个一个一个
输入:

df <- structure(list(
  date = c(
    "2021-1-1", "2021-1-2", "2021-1-3", "2021-1-4","2021-1-5", "2021-1-6"
  ), buy_price_actual = 1:6, call_price_actual = 2:7, sell_price_actual = 3:8, 
  buy_price_pred = 4:9, call_price_pred = 5:10,sell_price_pred = 6:11
), class = "data.frame", row.names = c(
  NA,
  -6L
))

创建于2023年1月30日,使用reprex v2.0.2

mklgxw1f

mklgxw1f2#

您可以生成两个名为df_buy和df_sell的 Dataframe ,方法是循环遍历这两个字符串并选择包含该字符串和'date'的列。我们使用assign()也根据字符串命名 Dataframe :

library(dplyr)

for (string in c('buy','sell')) {
  assign(paste0("df_",string), df %>%
           select(matches(paste0("date|",string))))
}

相关问题