【问题标题】:Data Frame, Data Cleaning数据框、数据清洗
【发布时间】:2019-03-06 16:59:54
【问题描述】:

我只是想知道是否有解决以下问题的最佳方法:

我有一个相当大的个人公司每日回报数据框。

dates  <- c("04.01.1995","05.01.1995","06.01.1995","09.01.1995","10.01.1995","11.01.1995","12.01.1995","13.01.1995")
stock1 <- rnorm(0.1,n = 3)
stock2 <- c(unlist(strsplit(rep("Na",8),split = " ")))
stock3 <- rnorm(0.1,n = 3)
stock4 <- rnorm(0.1,n = 3)
stock5 <- rnorm(0.1,n = 3)
stock6 <- rnorm(0.1,n = 3)
stock7 <- rnorm(0.1,n = 3)
stock8 <- c(unlist(strsplit(rep("Na",8),split = " ")))

cbind(dates,stock1,stock2,stock3,stock4,stock5,stock6,stock7,stock8)

看起来像这样:

dates         stock1   stock2  stock3      stock4               stock5....              
"04.01.1995" "1.8249" "Na"     "2.7125"    "0.557280737196038"  "1.38681707010098"  

我想计算每个特定行的平均值,然后删除同一行中低于“行均值”或阈值的观察值/元素。

提前致谢!

【问题讨论】:

  • 您可以使用mutate 计算逐行平均值,然后使用select 删除列
  • df.dropna(subset=['stock.2'])
  • 很不清楚你在问什么。请举例说明您拥有什么与您想要什么。
  • 对不起!上面提供的示例:)

标签: r


【解决方案1】:

我建议使用dplyr 包。网上有很多介绍,不过最好还是收下directly from Hadley

您的数据有点混乱:最好有一列表示日期、一列表示股票编号和一列表示值。这可以使用tidyr 包中的gather 函数轻松实现(顾名思义,这是一个专门清理杂乱数据的包)。同样,online resources 的负载。

从那里,您可能希望 group_by 公司/股票和年份,然后 summarise 获得每家公司和每年的平均值,然后 filter 只保留符合您标准的公司。

希望您有足够的关键字来更有效地搜索!

【讨论】:

  • 好的,因为我试图转置特定的行,删除 NA 然后计算平均值。然后通过嵌套的 for 循环删除每个特定单元格的观察值。虽然很难实现它,但也许不是最聪明的解决方案。感谢您的建议!
  • 是的,处理垂直和水平数据绝对不是简单的。简单地收集它要好得多(通过调用 tidyr::gather(df, stock, return, stock.1:stock.7) )。然后你的所有操作都会变得更容易,尤其是如果你使用dplyr
【解决方案2】:

你可以试试:

datos =data.frame(date=c('02/01/1995','2019-01-02','2019-01-03'),
                 stock.1=c(0.1,NA,6),
                 stock.2=c(NA,7,6),
                 stock.3=c(0.4,7,1),
                 stock.4=c(0.1,7,1),
                 stock.5=c(0.2,7,1),
                 stock.6=c(0.7,7,1),
                 stock.7=c(1.2,7,1)
                        )


result <- datos[!(datos$date == "02/01/1995" & datos$stock.1==0.1 &     datos$stock.2=="NA" & datos$stock.3==0.4 & datos$stock.4==0.1 & datos$stock.5==0.2 & 
datos$stock.6==0.7 & datos$stock.7==1.2),]

这是结果:

        date stock.1 stock.2 stock.3 stock.4 stock.5 stock.6 stock.7
1 02/01/1995     0.1      NA     0.4     0.1     0.2     0.7     1.2
2 2019-01-02      NA       7     7.0     7.0     7.0     7.0     7.0
3 2019-01-03     6.0       6     1.0     1.0     1.0     1.0     1.0
> result <- datos[!(datos$date == "02/01/1995" & datos$stock.1==0.1 &     datos$stock.2=="NA" & datos$stock.3==0.4 & datos$stock.4==0.1 & datos$stock.5==0.2 &     datos$stock.6==0.7 & datos$stock.7==1.2),]
> result
         date stock.1 stock.2 stock.3 stock.4 stock.5 stock.6 stock.7
NA       <NA>      NA      NA      NA      NA      NA      NA      NA
2  2019-01-02      NA       7       7       7       7       7       7
3  2019-01-03       6       6       1       1       1       1       1

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2021-02-04
    • 2019-03-15
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2020-10-01
    相关资源
    最近更新 更多