小编kis*_*msu的帖子

按行名称索引data.frame时出现意外行为

我不经常使用索引data.frame逐行名称,但有时候这样做有一个优势.但是,当我试图过滤出令人不快的行时,我注意到了意想不到的结果

  test <- data.frame(a = c("a", "b", "c"), 
                     b = c("A", "B", "C"), 
                     row.names = c(-99.5, 99.5, 99))
  test["-99", ]
Run Code Online (Sandbox Code Playgroud)

你会期望它会给你

     a    b
NA <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

但它回来了

      a b
-99.5 a A
Run Code Online (Sandbox Code Playgroud)

只是具体而言

Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 3.2.1 (2015-06-18)
 system   x86_64, mingw32             
 ui       RStudio (0.99.441)          
 language (EN)                        
 collate  English_United Kingdom.1252 
 tz       Europe/London  
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

r subset

10
推荐指数
1
解决办法
116
查看次数

热图与ggvis中的数字

我正在尝试使用ggvis中的ggplot2中的数字来复制热图.ggplot2版本是

library(ggplot2)
hec <- as.data.frame(xtabs(Freq ~ Hair + Eye, HairEyeColor))
ggplot(hec, aes(Hair, Eye)) +
geom_tile(aes(fill = Freq)) + 
geom_text(aes(label = Freq),colour="white") 
Run Code Online (Sandbox Code Playgroud)

它看起来像那样 在此输入图像描述

我在ggvis中的版本是

hec%>%
ggvis(~Hair, ~Eye, fill=~Freq)%>%
layer_rects(width = band(), height = band()) %>%
layer_text(text:=~Freq,fontSize := 20, fill:="white",baseline:="top",align:="center") %>%
scale_nominal("x", padding = 0, points = FALSE) %>%
scale_nominal("y", padding = 0, points = FALSE) 
Run Code Online (Sandbox Code Playgroud)

结果并不完美

在此输入图像描述

我试图通过手动添加边距来修复数字对齐,但这种情况不可调整大小.

有任何想法吗?

r ggvis

8
推荐指数
1
解决办法
2175
查看次数

具有过滤数据的笛卡儿积.表

我正在尝试通过data.table调用替换SQL生成的笛卡尔积.我拥有丰富的资产和价值历史,我需要所有组合的子集.假设我有一个表格,其中T = [date,contract,value].在SQL中它看起来像

SELECT a.date, a.contract, a.value, b.contract. b.value 
FROM T a, T b
WHERE a.date = b.date AND a.contract <> b.contract AND a.value + b.value < 4
Run Code Online (Sandbox Code Playgroud)

在RI现在有以下内容

library(data.table)

n <- 1500
dt <- data.table(date     = rep(seq(Sys.Date() - n+1, Sys.Date(), by = "1 day"), 3),
                 contract = c(rep("a", n), rep("b", n), rep("c", n)),
                 value    = c(rep(1, n), rep(2, n), rep(3, n)))
setkey(dt, date)

dt[dt, allow.cartesian = TRUE][(contract != i.contract) & (value + i.value < 4)]
Run Code Online (Sandbox Code Playgroud)

我相信我的解决方案首先创建所有组合(在这种情况下为13,500行),然后过滤(到3000).然而SQL(我可能错了)加入子集,更重要的是不要将所有组合加载到RAM中.任何想法如何使用data.table更有效?

r data.table

7
推荐指数
1
解决办法
868
查看次数

更改Flexdashboard中单个文本部分的字体大小

我正在使用flexdashboard创建报告,并且只想更改页面一部分的字体大小。

在我看来,可以通过添加CSS类来做到这一点,但是我找不到如何在R markdown代码中指定类名的方法。

有任何想法吗?

r r-markdown flexdashboard

6
推荐指数
1
解决办法
3504
查看次数

从dplyr对象创建新的SQL表而不使用R内存

我正在使用dplyr对PostgreSQL中的大表进行操作.经过多次操作后,我有一个大的派生表,我想保存到一个新表.原始解决方案是将其加载到R存储器并写入数据库.这听起来很可怕,因为新表只是一个由dplyr生成的CREATE + SQL.有什么方法可以使用内置函数将CREATE或UPDATE应用于数据库dplyr对象?

sql memory r dplyr

4
推荐指数
1
解决办法
698
查看次数

在Windows上的parLapply中使用Rcpp函数

我正在使用Rcpp和Windows上的并行计算进行R代码优化.我在parLapply中调用Rcpp函数时遇到问题.这个例子如下

Rcpp代码(test.cpp)

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector payoff( double strike, NumericVector data) {
    return pmax(data - strike, 0);
}
Run Code Online (Sandbox Code Playgroud)

R代码

library(parallel)
library(Rcpp)

sourceCpp("test.cpp")

strike_list <- as.list(seq(10, 100, by = 5))

data <- runif(10000) * 50

# One core version
strike_payoff <- lapply(strike_list, payoff, data)

# Multiple cores version
numWorkers <- detectCores()
cl <- makeCluster(numWorkers, type = "PSOCK")
clusterExport(cl = cl,varlist = "payoff")
strike_payoff <- parLapply(cl, strike_list, payoff, data)
Run Code Online (Sandbox Code Playgroud)

并行版本出错

Error in checkForRemoteErrors(val) : 
  8 nodes produced errors; …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r rcpp

4
推荐指数
1
解决办法
977
查看次数

舍入到倍数并过滤data.table

我有一个非常有趣的问题,但我宁愿没有.我必须将一个数字舍入到一个结束的数字,所以我按照这里的解决方案 它曾经工作正常,直到我发现data.table的错误

library(data.table)
options(digits = 20) # to see number representation
mround <- function (number, multiple) {
   return(multiple * round(number / multiple))
}
DT = data.table(a = mround(112.3, 0.1), b = "B")
DT[a == 112.3,] # works as expected, i.e returns one row
DT[a == 112.3 & b == 'B', ] # doesn't work
Run Code Online (Sandbox Code Playgroud)

公平地说,data.frame即使第一个过滤器也不起作用.任何想法如何解决?

r data.table

4
推荐指数
1
解决办法
232
查看次数

在j data.table中使用语法无效的名称

我有一个data.table,列名不是有效的R名

DT = data.table(a = c(1, 2), `0b` = c(4, 5))
Run Code Online (Sandbox Code Playgroud)

我想用这样的东西

my_column <- "0b"
DT[, mean(eval(parse(text = my_column)))] 
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误

Error in parse(text = my_column) : <text>:1:2: unexpected symbol
1: 0b
     ^
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做到这一点,即使用无效的列名作为j中的变量?

r data.table

2
推荐指数
3
解决办法
82
查看次数