小编Fra*_*ank的帖子

将data.frame转换为data.table列丢失

有这样的情况.试图将"mtcars"类从data.frame转换为data.table.

"mtcars"数据:

> mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Run Code Online (Sandbox Code Playgroud)

原始类是"data.frame".

> str(mtcars)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ …
Run Code Online (Sandbox Code Playgroud)

r dataframe data.table

9
推荐指数
1
解决办法
1万
查看次数

如何构建从data.table到magrittr并返回data.table的管道

我想将data.table管道与magrittr流水线混合.我可以从data.table转到%>%,但我无法弄清楚如何回到[] [] data.table样式的流水线.

这是一个例子:

> tbl = data.table(grp=c(1,1,1,2,2,2,3,3,3,4,4), y=rnorm(11))
> tbl
    grp        y
 1:   1  0.08150
 2:   1  1.51330
 3:   1 -0.26154
 4:   2 -0.12746
 5:   2  0.10747
 6:   2  0.16502
 7:   3  0.54139
 8:   3 -0.04194
 9:   3  0.02373
10:   4  2.00756
11:   4  1.05523
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := NULL]
   grp      V2
1:   1 0.44442
2:   2 0.04834
3:   3 0.17439
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := …
Run Code Online (Sandbox Code Playgroud)

r magrittr data.table

9
推荐指数
1
解决办法
1470
查看次数

如何根据2列之间的条件连接数据帧

我遇到了一个需要合并两个数据框的项目.他们看起来像这样:

Data1
Traffic Source    Registrations    Hour    Minute
organic           1                6        13
social            1                8        54

Data2
Email                     Hour2   Minute2
test@domain.com           6         13
test2@domain2.com         8         55
Run Code Online (Sandbox Code Playgroud)

我有以下代码行来合并2个数据帧:

merge.df <- merge(Data1, Data2, by.x = c( "Hour", "Minute"),
           by.y = c( "Hour2", "Minute2"))
Run Code Online (Sandbox Code Playgroud)

如果两个数据集之间的可变时间(小时和分钟)没有略微偏离,那将会很有效.有没有办法让列"分钟"与"Minute2"匹配,如果它是+或 - 一分钟关闭?

我以为我可以为数据集1创建2个新列:

Data1
Traffic Source    Registrations   Hour   Minute    Minute_plus1   Minute_minus1
organic           1               6        13      14              12
social            1               8        54      55              53
Run Code Online (Sandbox Code Playgroud)

如果"Minute2"匹配"Minute","Minute_plus1"或"Minute_minus1"中的任何变量,是否可以合并2个数据帧?或者是否有更有效的方法来完成此合并?

merge r dataframe

9
推荐指数
1
解决办法
2万
查看次数

将命名元素列表转换为数据框或数据表

我有一个命名元素列表(testlist),其中一些名称是重复的

$x
[1] "one"

$x
[1] "two"

$y
[1] "three"

$y
[1] "four"
Run Code Online (Sandbox Code Playgroud)

我试图最终得到一个数据表,它将元素与通用名称组合到同一列中.

     x     y
1: one three
2: two  four
Run Code Online (Sandbox Code Playgroud)

我试过了

testdf <- do.call(cbind, lapply(testlist, data.table))
Run Code Online (Sandbox Code Playgroud)

但最终只有:

   x.V1 x.V1  y.V1 y.V1
1:  one  two three four
Run Code Online (Sandbox Code Playgroud)

有什么建议?感谢帮助!

r dataframe

9
推荐指数
2
解决办法
101
查看次数

使用"$"功能进行补偿

我在hadley的功能指南中经历了一些例子,并遇到了意想不到的问题.

假设我有一个模型对象列表,

x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x))
Run Code Online (Sandbox Code Playgroud)

并希望从每个中提取一些东西(如hadley关于名为"试验"的列表的问题所示).我期待其中一个工作:

lapply(bah,`$`,i='call') # or...
lapply(bah,`$`,call)
Run Code Online (Sandbox Code Playgroud)

但是,这些返回null.好像我没有滥用这个$功能,因为这些东西有效:

`$`(bah[[1]],i='call')
`$`(bah[[1]],call)
Run Code Online (Sandbox Code Playgroud)

无论如何,我只是把它作为一个练习,我很好奇我的错误.我知道我可以使用匿名函数,但认为必须有一种方法来使用类似于我最初的非解决方案的语法.我已经看过了$所提到的地方?Extract,但没有看到任何明显的解释.

我才意识到这有效:

lapply(bah,`[[`,i='call')
Run Code Online (Sandbox Code Playgroud)

还有这个

lapply(bah,function(x)`$`(x,call))
Run Code Online (Sandbox Code Playgroud)

也许这只是归结为一些lapply需要匿名功能而不需要任何功能的伏都教?我觉得我以前在某个地方听说过.

r lapply

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

data.table`:=`具有动态输入(现有列)和输出(新列名)的赋值表达式

注意:我在此问题中遇到的确切问题不适用于最新版本的数据表.如果你想做标题中描述的事情,请查看包FAQ中的相应问题,1.6确定,但我不提前知道这些表达式.我如何以编程方式传递它们?.

我已经看到一个答案,说明如何构建一个要进行评估的表达式

DT[,j=eval(expr)]
Run Code Online (Sandbox Code Playgroud)

我正在使用这个作业,```:=`(mycol = my_calculation)``,我想知道......

  • 如何动态分配名称"mycol"?
  • 让"my_calculation"采用动态确定的列集的正确方法是什么?

通过"动态",我的意思是"在我为我编写代码后确定expr".

新的例子

编辑:为了更好地说明问题,这里是不同的例子.查看编辑历史记录以查看原始文件.

require(data.table)
require(plyr)
options(datatable.verbose=TRUE)
DT <- CJ(a=0:1,b=0:1,y=2)

# setup:
expr  <- as.quoted(paste(expression(get(col_in_one)+get(col_in_two))))[[1]]

# usage: 
col_in_one <- 'a'
col_in_two <- 'b'
col_out    <- 'bah'
DT[,(col_out):=eval(expr)] # fails, should take the form j=eval(expr)
Run Code Online (Sandbox Code Playgroud)

我想将设置和使用阶段分开,因此我的代码更易于维护.我的真实表达比这个例子更麻烦(它只选择一列).

问题

第一个问题:如何使分配到的列"col_out"动态化?我的意思是:我想动态指定"cols_in_*"和"col_out".

我尝试在"expr"中创建各种表达式,但as.quoted抛出一个错误,即不将某些东西放在=符号的左边.

第二个问题:如何避免使用警告get

警告建议使用.SDcols,以便[.data.table知道我正在使用哪些列.但是,如果我使用这个.SDcols参数,另一个警告说除非.SD正在使用,否则没有必要这样做.

暂时的解决方案

我到目前为止的解决方案是......

# Ricardo + eddi:
expr2 …
Run Code Online (Sandbox Code Playgroud)

r data.table

8
推荐指数
2
解决办法
1066
查看次数

将排名列添加到数据框

我有一些月度数据,我想在我的数据框中添加一列,将第一列中的最小值与第一列中的最大值相关联.第一列中的第二个最小值到第一列中的第二个最大值,例如......

这是一些示例数据

x1<-c(100,151,109,59,161,104,170,101)
dat<-data.frame(x1)
rownames(dat)<-c('Apr','May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov')

     x1
Apr 100
May 151
Jun 109
Jul  59
Aug 161
Sep 104
Oct 170
Nov 101
Run Code Online (Sandbox Code Playgroud)

我试图让我的数据看起来像这样

     x1   x2
Apr 100  161
May 151  101
Jun 109  104
Jul  59  170
Aug 161  100
Sep 104  109
Oct 170   59
Nov 101  151
Run Code Online (Sandbox Code Playgroud)

我带着等级,排序和顺序进入圈子.任何帮助,将不胜感激.

r dataframe

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

有没有办法`管道列表'?

ggplot2我从未真正开发的包中的一个非常酷的功能是在图中添加图层列表.有趣的是,我可以将一个图层列表作为参数传递给函数,并将它们添加到图中.然后,我可以获得所需的情节外观,而不必从功能中返回情节(这是否是一个好主意是另一回事,但它是可能的).

library(ggplot2)
x <- ggplot(mtcars,
            aes(x = qsec,
                y = mpg)) 

layers <- list(geom_point(),
               geom_line(),
               xlab("Quarter Mile Time"),
               ylab("Fuel Efficiency"))

x + layers
Run Code Online (Sandbox Code Playgroud)

有没有办法用管道做到这一点?类似于:

#* Obviously isn't going to work
library(dplyr)
action <- list(group_by(am, gear),
               summarise(mean = mean(mpg),
                         sd = sd(mpg)))

mtcars %>% action
Run Code Online (Sandbox Code Playgroud)

r ggplot2 dplyr magrittr

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

R - 创建一个新变量,其中每个观察值取决于另一个表和数据框中的其他变量

我有以下两个表:

df <- data.frame(eth = c("A","B","B","A","C"),ZIP1 = c(1,1,2,3,5))
Inc <- data.frame(ZIP2 = c(1,2,3,4,5,6,7),A = c(56,98,43,4,90,19,59), B = c(49,10,69,30,10,4,95),C = c(69,2,59,8,17,84,30))

eth    ZIP1         ZIP2    A    B    C
A      1            1      56   49   69
B      1            2      98   10   2
B      2            3      43   69   59
A      3            4      4    30   8
C      5            5      90   10   17
                    6      19   4    84
                    7      59   95   39
Run Code Online (Sandbox Code Playgroud)

我想在df数据框中创建一个变量Inc,对于每个观察,该值是观察的eth和ZIP的交集.在我的例子中,它会导致:

   eth    ZIP1   Inc        
    A      1    56
    B      1    49
    B      2    10
    A      3    43 …
Run Code Online (Sandbox Code Playgroud)

r data.table

8
推荐指数
4
解决办法
398
查看次数

在R中的两个数据表之间按行计算匹配元素

我在R中有两个数据框,我需要逐行计算元素匹配,最后获得一个列,其中包含两个表的笛卡尔积的长度和两行的ID.此外,表格非常大,行数不同,但列数相同.

我有以下代码,但多次运行时速度很慢.

library(data.table)

table_1<-data.table(matrix(c(1:24),nrow = 4))
table_2<-data.table(matrix(c(11:34),nrow = 4))

names(table_1)<-c("s1", "s2","s3","s4","s5","s6")
names(table_2)<-c("a1","a2","a3","a4","a5","a6")

table_1$ID<-seq.int(nrow(table_1))
table_2$ID_ap<-seq.int(nrow(table_2))

setcolorder(table_1, c("ID", "s1", "s2","s3","s4","s5","s6"))
setcolorder(table_2, c("ID_ap","a1","a2","a3","a4","a5","a6"))

CJ.table<-function(X,Y) setkey(X[,c(k=1,.SD)],k)[Y[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL] 

join<-CJ.table(table_1,table_2)

R<-subset(join, select=c("ID_ap","ID"))

R$Ac<- (join$s1 == join$a1) + (join$s1 ==join$a2) + (join$s1 ==join$a3) + (join$s1 ==join$a4) + (join$s1 ==join$a5) + (join$s1 ==join$a6)+ 
(join$s2 == join$a1) + (join$s2 ==join$a2) + (join$s2 ==join$a3) + (join$s2 ==join$a4) + (join$s2 ==join$a5) + (join$s2 ==join$a6)+ 
(join$s3 == join$a1) + (join$s3 ==join$a2) + (join$s3 ==join$a3) + (join$s3 ==join$a4) + (join$s3 ==join$a5) + (join$s3 ==join$a6)+ …
Run Code Online (Sandbox Code Playgroud)

optimization performance r match data.table

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

标签 统计

r ×10

data.table ×5

dataframe ×4

magrittr ×2

dplyr ×1

ggplot2 ×1

lapply ×1

match ×1

merge ×1

optimization ×1

performance ×1