R 如何使用if语句将整行分隔成新的数据帧

R 如何使用if语句将整行分隔成新的数据帧,r,if-statement,R,If Statement,我有一个数据帧df,看起来像这样: Date Company MarketCap 2000-01-31 Company one 1000 2000-02-28 Company one 2000 2000-03-31 Company one 3000 2000-01-31 Company two 2500 2000-02-28 Company two 3000 2000-03-31 Company tw

我有一个数据帧
df
,看起来像这样:

Date         Company         MarketCap
2000-01-31   Company one     1000
2000-02-28   Company one     2000
2000-03-31   Company one     3000
2000-01-31   Company two     2500
2000-02-28   Company two     3000
2000-03-31   Company two     3500
2000-01-31   Company three   1500
2000-02-28   Company three   1800
2000-03-31   Company three   1100
我需要执行以下操作的if语句:

If(df$MarketCap >= median(df$MarketCap){
  BigCap <- df[all the rows that have a market cap >= median(df$MarketCap)
}
我觉得使用if语句应该很容易实现这一点,但到目前为止,我还没有取得任何成功(也不是通过在SO上查看类似的问题)。我感谢所有能得到的帮助


注意,我的实际df比这里提供的示例要大得多,在这里我有360个日期和2000多家公司。

我创建了
SmallCap
LargeCap
,这是一个数据列表。框架包含
=median(MarketCap)
的观察值。列表中的每个条目都是一个单独的日期

library(dplyr)
SmallCap <- df %>%
             group_by(Date) %>%
           filter(MarketCap < median(MarketCap)) %>%
             split(.$Date)

# $`1`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-01-31 Company_one      1000

# $`2`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-02-28 Company_three      1800

# $`3`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-03-31 Company_three      1100

LargeCap <- df %>%
         group_by(Date) %>%
           filter(MarketCap >= median(MarketCap)) %>%
             split(.$Date)

# $`2000-01-31`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-01-31   Company_two      2500
# 2 2000-01-31 Company_three      1500

# $`2000-02-28`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-02-28 Company_one      2000
# 2 2000-02-28 Company_two      3000

# $`2000-03-31`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-03-31 Company_one      3000
# 2 2000-03-31 Company_two      3500
库(dplyr)
小盘股%
分组单位(日期)%>%
过滤器(MarketCap<中值(MarketCap))%>%
拆分(.$日期)
# $`1`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-01-31公司1 1000
# $`2`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-02-28三连1800
# $`3`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-03-31第三公司1100
大上限%
分组单位(日期)%>%
过滤器(MarketCap>=中值(MarketCap))%>%
拆分(.$日期)
# $`2000-01-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-01-31公司2 2500
#2000年01月31日第三公司1500
# $`2000-02-28`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-02-28 2000年第一公司
#2 2000-02-28公司2 3000
# $`2000-03-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-03-31公司1 3000
#2 2000-03-31公司2 3500

我创建了
SmallCap
LargeCap
,这是一个数据框架列表,其中包含
=median(MarketCap)
的观察值。列表中的每个条目都是一个单独的日期

library(dplyr)
SmallCap <- df %>%
             group_by(Date) %>%
           filter(MarketCap < median(MarketCap)) %>%
             split(.$Date)

# $`1`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-01-31 Company_one      1000

# $`2`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-02-28 Company_three      1800

# $`3`
# # A tibble: 1 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-03-31 Company_three      1100

LargeCap <- df %>%
         group_by(Date) %>%
           filter(MarketCap >= median(MarketCap)) %>%
             split(.$Date)

# $`2000-01-31`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date       Company MarketCap
      # <fctr>        <fctr>     <int>
# 1 2000-01-31   Company_two      2500
# 2 2000-01-31 Company_three      1500

# $`2000-02-28`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-02-28 Company_one      2000
# 2 2000-02-28 Company_two      3000

# $`2000-03-31`
# # A tibble: 2 x 3
# # Groups:   Date [1]
        # Date     Company MarketCap
      # <fctr>      <fctr>     <int>
# 1 2000-03-31 Company_one      3000
# 2 2000-03-31 Company_two      3500
库(dplyr)
小盘股%
分组单位(日期)%>%
过滤器(MarketCap<中值(MarketCap))%>%
拆分(.$日期)
# $`1`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-01-31公司1 1000
# $`2`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-02-28三连1800
# $`3`
##A tible:1 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-03-31第三公司1100
大上限%
分组单位(日期)%>%
过滤器(MarketCap>=中值(MarketCap))%>%
拆分(.$日期)
# $`2000-01-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#              
#1 2000-01-31公司2 2500
#2000年01月31日第三公司1500
# $`2000-02-28`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-02-28 2000年第一公司
#2 2000-02-28公司2 3000
# $`2000-03-31`
##tibble:2 x 3
##分组:日期[1]
#日期公司市值
#            
#1 2000-03-31公司1 3000
#2 2000-03-31公司2 3500

我喜欢CPak的答案,但如果您需要单独的
数据.frames
,这可以:

df <- data.frame(date = rep(Sys.Date() - c(60,30,0), 3), comp = rep(1:3, each = 3),
             cap = c(1000, 2000, 3000, 2500, 3000, 3500, 1500, 1800, 1100))

for (i in unique(as.character(df$date))) {
  med <- median(df$cap[df$date == i])
  assign(paste0("smallCap", format(as.Date(i), "%b")),
         df[df$date == i & df$cap < med, ])
  assign(paste0("bigCap", format(as.Date(i), "%b")),
         df[df$date == i & df$cap >= med, ])
}

df我喜欢CPak的答案,但如果您需要单独的
数据.frames
,这可以:

df <- data.frame(date = rep(Sys.Date() - c(60,30,0), 3), comp = rep(1:3, each = 3),
             cap = c(1000, 2000, 3000, 2500, 3000, 3500, 1500, 1800, 1100))

for (i in unique(as.character(df$date))) {
  med <- median(df$cap[df$date == i])
  assign(paste0("smallCap", format(as.Date(i), "%b")),
         df[df$date == i & df$cap < med, ])
  assign(paste0("bigCap", format(as.Date(i), "%b")),
         df[df$date == i & df$cap >= med, ])
}

df我会试试你的答案,看看我能不能让它工作。请注意,我现在已经对我的问题进行了一些编辑,为了更容易理解(或者解决)您编辑的问题,现在只需要
BigCap=median(df$MarketCap,na.rm=T),]
谢谢,这很有效:)我确信我需要一个if-and/or-for语句。如果,就像我最初的问题一样,我只想在某些日期这样做会怎么样。也就是说,我想对1月份的所有市值做一个大于或等于1月份市值中值的大头寸。有没有一种简单的方法可以在您的解决方案中实现这一点?我试过使用
BigCapJan=median(df$MarketCap[stri\u detect\u fixed(df$Date,“2000-01”)],na.rm=T),]
但这似乎不起作用。我会尝试你的答案,看看我是否能让它起作用。请注意,我现在已经对我的问题进行了一些编辑,为了更容易理解(或者解决)您编辑的问题,现在只需要
BigCap=median(df$MarketCap,na.rm=T),]
谢谢,这很有效:)我确信我需要一个if-and/or-for语句。如果,就像我最初的问题一样,我只想在某些日期这样做会怎么样。也就是说,我想对1月份的所有市值做一个大于或等于1月份市值中值的大头寸。有没有一种简单的方法可以在您的解决方案中实现这一点?我试过使用
BigCapJan=median(df$MarketCap[stri\u detect\u fixed(df$Date,“2000-01”)],na.rm=T),]
但这似乎不起作用。
med <- median(df$cap[format(df$date, "%m") == "10"])
BigCapOct <- df[format(df$date, "%m") == "10" & df$cap >= med, ]