假设我有一个包含两列或更多列的数据帧df,是否有一种简单的方法可以使用unique()或其他R函数来创建两列或更多列的唯一组合的子集?
我知道我可以使用sqldf()并编写一个简单的"SELECT DISTINCT var1, var2, ... varN"查询,但我正在寻找一种R方式来做到这一点.
我想到尝试ftable强制转换为数据帧并使用字段名称,但我也得到了数据集中不存在的组合的交叉表:
uniques <- as.data.frame(ftable(df$var1, df$var2))
Run Code Online (Sandbox Code Playgroud) 我知道在这里有很多关于使用do.call或ldply将data.frames列表转换为单个data.frame的方法,但这个问题是关于理解两种方法的内部工作方式并试图找出原因我无法将两个相同结构,相同字段名称等近100万个df的列表连接到一个data.frame中.每个data.frame都是一行和21列.
数据以JSON文件开头,我使用fromJSON转换为列表,然后运行另一个lapply来提取列表的一部分并转换为data.frame,最后得到一个data.frames列表.
我试过了:
df <- do.call("rbind", list)
df <- ldply(list)
Run Code Online (Sandbox Code Playgroud)
但我不得不在让它运行3个小时并且没有得到任何回报之后终止这个过程.
有更有效的方法吗?我怎样才能解决正在发生的事情以及为什么需要这么长时间?
仅供参考 - 我在使用RHEL的72GB四核服务器上使用RStudio服务器,所以我认为内存不是问题所在.sessionInfo如下:
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-redhat-linux-gnu (64-bit)
locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] multicore_0.1-7 plyr_1.7.1      rjson_0.2.6    
loaded via a namespace (and not attached):
[1] tools_2.14.1
> 
Run Code Online (Sandbox Code Playgroud) 这令我感到困惑.当您对整数向量运行summary()时,您似乎无法获得准确的结果.这些数字似乎已圆满了.我在三台不同操作系统的机器上试过这个,结果是一样的.
对于矢量:
>a <- 0:628846
>str(a)
 int [1:628847] 0 1 2 3 4 5 6 7 8 9 ...
>summary(a)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0  157200  314400  314400  471600  628800 
>max(a)
[1] 628846
Run Code Online (Sandbox Code Playgroud)
对于data.frame:
> b <- data.frame(b = 0:628846)
> str(b)
'data.frame':   628847 obs. of  1 variable:
 $ b: int  0 1 2 3 4 5 6 7 8 9 ...
> summary(b)
       b         
 Min.   :     0  
 1st Qu.:157212  
 Median :314423  
 Mean   :314423  
 3rd Qu.:471635 …Run Code Online (Sandbox Code Playgroud) 当我使用RODBC从R连接到GreenPlum PostgreSQL数据库时,我遇到了一个我从未得过的新错误.我使用EMACS/ESS和RStudio得到了错误,并且RODBC调用过去一如既往.
library(RODBC)
gp <- odbcConnect("greenplum", believeNRows = FALSE)
data <- sqlQuery(gp, "select * from mytable")
> data
[1] "22P05 7 ERROR: character 0xc280 of encoding \"UTF8\" has no equivalent in  "WIN1252\";\nError while executing the query" 
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select * from mytable'"
Run Code Online (Sandbox Code Playgroud)
编辑:刚刚尝试查询另一个表,并得到了结果.所以我猜这不是RODBC问题,而是PostgreSQL表编码问题.
R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base …Run Code Online (Sandbox Code Playgroud) 我有一个1,344个独特字符串的向量x.我想生成一个矩阵,它给我所有可能的三个值组,无论顺序如何,并将其导出到csv.
我在m1.large实例w 64bit Ubuntu上运行EC on EC2.使用combn(x,3)时出现内存不足错误:
Error: cannot allocate vector of size 9.0 Gb
Run Code Online (Sandbox Code Playgroud)
得到的矩阵的大小是C1344,3 = 403,716,544行和三列 - 这是combn()函数结果的转置.
我想使用bigmemory包创建一个文件支持的big.matrix,然后我可以分配combn()函数的结果.我可以创建一个预分配的大矩阵:
library(bigmemory)
x <- as.character(1:1344)
combos <- 403716544
test <- filebacked.big.matrix(nrow = combos, ncol = 3, 
        init = 0, backingfile = "test.matrix")
Run Code Online (Sandbox Code Playgroud)
但是当我尝试分配值时,test <- combn(x, 3)我仍然会得到相同的结果:Error: cannot allocate vector of size 9.0 Gb
我甚至尝试强制结果,combn(x,3)但我认为因为combn()函数返回错误,big.matrix函数也不起作用.
test <- as.big.matrix(matrix(combn(x, 3)), backingfile = "abc")
Error: cannot allocate vector of size 9.0 Gb
Error in as.big.matrix(matrix(combn(x, 3)), backingfile = "abc") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Amazon Elastic Map Reduce来运行数百万个案例的一系列模拟.这是一个没有reducer的Rscript流媒体作业.我在EMR调用中使用Identity Reducer --reducer org.apache.hadoop.mapred.lib.IdentityReducer.
当手动传递一行字符串时,脚本文件在测试并在Linux机器上的命令行本地运行时工作正常echo "1,2443,2442,1,5" | ./mapper.R,我得到了我期望的一行结果.然而,当我使用EMR上的输入文件中的大约10,000个案例(行)测试我的模拟时,我只得到10个输入行中的十几行输出.我已经尝试了几次,但我无法弄清楚原因.Hadoop作业运行正常,没有任何错误.看起来输入行似乎被跳过,或者可能是Identity Reducer发生了什么.对于有输出的情况,结果是正确的.
我的输入文件是一个具有以下数据格式的csv,一系列由逗号分隔的五个整数:
1,2443,2442,1,5
2,2743,4712,99,8
3,2443,861,282,3177
etc...
Run Code Online (Sandbox Code Playgroud)
这是mapper.R的 R脚本
#! /usr/bin/env Rscript
# Define Functions
trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)
splitIntoWords <- function(line) unlist(strsplit(line, "[[:space:]]+"))
# function to read in the relevant data from needed data files
get.data <- function(casename) {
    list <- lapply(casename, function(x) {
        read.csv(file = paste("./inputdata/",x, ".csv", sep = ""),
                 header = TRUE,
        stringsAsFactors = FALSE)})
    return(data.frame(list))
} …Run Code Online (Sandbox Code Playgroud) 我似乎无法找到有关ggplot2 0.9.0文档,0.9.0过渡指南或搜索的信息.
我想在早期版本中你要添加tz参数scale_x_datetime.我已经尝试将tz论点放在不同的地方,scale_x_datetime但不断出错.见下文.
我的日期时间数据POSIXct采用GMT时区格式.当我绘制它时,轴刻度和中断显示我的当地时区(EST).我希望轴上的午夜在GMT时区午夜.在ggplot2 0.9.0中执行此操作的正确方法是什么?
attributes(data$date)
# $class
# [1] "POSIXct" "POSIXt" 
# $tzone
# [1] "GMT"
ggplot(data, aes(x = date)) +
  geom_line(aes(y = count)) +
  scale_x_datetime(breaks = date_breaks("1 day"),
                   labels = date_format("%d", tz = "UTC"))
# Error in date_format("%d", tz = "UTC") : unused argument(s) (tz = "UTC")
ggplot(data, aes(x = date)) +
  geom_line(aes(y = count)) +
  scale_x_datetime(breaks = date_breaks("1 day", tz = "UTC"),
                   labels = date_format("%d"))
# …Run Code Online (Sandbox Code Playgroud) 我有几个类似文件名的.csv文件,除了数字月份(即03_data.csv,04_data.csv,05_data.csv等),我想读入R.
我有两个问题:
r ×9
matlab ×2
amazon-emr ×1
bigdata ×1
data.table ×1
dataframe ×1
datetime ×1
do.call ×1
ggplot2 ×1
greenplum ×1
hadoop ×1
performance ×1
plyr ×1
postgresql ×1
rodbc ×1
simulation ×1
sql ×1
timezone ×1