小编Vas*_*y A的帖子

将几个参数传递给lapply的乐趣(以及其他*适用)

(这一定是一个非常基本的问题,但到目前为止我没有在R手册中找到答案......)

当我使用lapply语法时lapply- 这很容易理解,我可以像这样定义myfun:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);
Run Code Online (Sandbox Code Playgroud)

和元素R作为lapply(input, myfun);参数传递给input.

但是,如果我需要传递更多参数x呢?例如,它定义如下:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}
Run Code Online (Sandbox Code Playgroud)

如何使用此函数传递两个myfun元素(作为myfunc参数)和其他一些参数?

r lapply

83
推荐指数
4
解决办法
7万
查看次数

转置data.table的最佳方法

我经常需要转换一个data.table,每次需要几行代码,我想知道是否有比我更好的解决方案.

如果我们拿样品表

library(data.table)
mydata <- data.table(col0=c("row1","row2","row3"),
                     col1=c(11,21,31),
                     col2=c(12,22,32),
                     col3=c(13,23,33))

mydata
# col0 col1 col2 col3
# row1   11   12   13
# row2   21   22   23
# row3   31   32   33
Run Code Online (Sandbox Code Playgroud)

只需转置它t(),它将转换为矩阵并转换为character类型,而应用于data.table此类矩阵将丢失row.names:

t(mydata)
# [,1]   [,2]   [,3]  
# col0 "row1" "row2" "row3"
# col1 "11"   "21"   "31"  
# col2 "12"   "22"   "32"  
# col3 "13"   "23"   "33"  

data.table(t(mydata))
#   V1   V2   V3
# row1 row2 row3
#   11   21   31
# …
Run Code Online (Sandbox Code Playgroud)

r data.table

34
推荐指数
4
解决办法
5万
查看次数

用变量号解释aes中的x和y

我需要通过列号而不是名称来绘制带有寻址变量的散点图,即ggplot(dat, aes(x=Var1, y=Var2))我不需要像ggplot(dat, aes(x=dat[,1], y=dat[,2])).(我说'某事',因为后者不起作用).

这是我的代码:

showplot1<-function(indata, inx, iny){
  dat<-indata
  print(nrow(dat)); # this is just to show that object 'dat' is defined
  p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]))
  p + geom_point(size=4, alpha = 0.5)
}

testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100))
showplot1(indata=testdata, inx=2, iny=3)
Run Code Online (Sandbox Code Playgroud)
# Error in eval(expr, envir, enclos) : object 'dat' not found
Run Code Online (Sandbox Code Playgroud)

r ggplot2

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

在data.table中查找*all*重复记录(不是全部而是一个)

如果我理解正确,duplicated()函数data.table返回一个逻辑向量,它不包含第一次出现的重复记录.标记第一次出现的最佳方法是什么?在这种情况下base::duplicated(),我只是通过与逆序函数分离来解决这个问题:myDups <- (duplicated(x) | duplicated(x, fromLast=TRUE))- 但是data.table::duplicated(),fromLast=TRUE不包括在内(我不知道为什么)......

PS好的,这是一个原始的例子

myDT <- fread(
"id,fB,fC
 1, b1,c1
 2, b2,c2
 3, b1,c1
 4, b3,c3
 5, b1,c1
")
setkeyv(myDT, c('fB', 'fC'))
myDT[, fD:=duplicated(myDT)]
Run Code Online (Sandbox Code Playgroud)

第1,3和5行都是重复的,但只有3和5将被包括在内,duplicated而我需要标记所有这些.

UPD.重要提示:我在下面接受的答案仅适用于键控表.如果要查找考虑所有列的重复记录,则必须setkey明确显示所有这些列.到目前为止,我专门针对这种情况使用以下解决方法:

dups1 <- duplicated(myDT);
dups2 <- duplicated(myDT, fromLast=T);
dups <- dups1 | dups2;
Run Code Online (Sandbox Code Playgroud)

r data.table

29
推荐指数
4
解决办法
9534
查看次数

使用多个值列重新定义宽到长

我需要将我的宽表重新整形为长格式,但为每条记录保留多个字段,例如:

dw <- read.table(header=T, text='
 sbj f1.avg f1.sd f2.avg f2.sd  blabla
   A   10    6     50     10      bA
   B   12    5     70     11      bB
   C   20    7     20     8       bC
   D   22    8     22     9       bD
 ')

# Now I want to melt this table, keeping both AVG and SD as separate fields for each measurement, to get something like this:

 #    sbj var avg  sd  blabla
 #     A   f1  10  6     bA
 #     A   f2  50  10    bA
 #     B …
Run Code Online (Sandbox Code Playgroud)

r reshape melt reshape2

27
推荐指数
5
解决办法
3万
查看次数

复杂的重塑

我想重塑我的数据帧从长格式到宽格式,我放弃了一些我想保留的数据.对于以下示例:

df <- data.frame(Par1 = unlist(strsplit("AABBCCC","")),
                 Par2 = unlist(strsplit("DDEEFFF","")),
                 ParD = unlist(strsplit("foo,bar,baz,qux,bla,xyz,meh",",")),
                 Type = unlist(strsplit("pre,post,pre,post,pre,post,post",",")),
                 Val = c(10,20,30,40,50,60,70))

   #     Par1 Par2 ParD Type Val
   #   1    A    D  foo  pre  10
   #   2    A    D  bar post  20
   #   3    B    E  baz  pre  30
   #   4    B    E  qux post  40
   #   5    C    F  bla  pre  50
   #   6    C    F  xyz post  60
   #   7    C    F  meh post  70

dfw <- dcast(df,
             formula = Par1 + …
Run Code Online (Sandbox Code Playgroud)

r dataframe reshape2

19
推荐指数
5
解决办法
877
查看次数

有什么方法可以强制fread()的data.table不要停在空行上?

(问题不再相关,因为data.table25-NOV-2016的新版本- 见下面接受的答案)

所以,我有一张桌子,中间有一些空行.当我试图打开它时fread,它会停下来说Stopped reading at empty line 10006, but text exists afterwards (discarded).有没有办法在不更改数据文件的情况下避免这种情况?

r data.table

17
推荐指数
2
解决办法
5133
查看次数

如何在data.table中"取消列出"列

在我的表中,一些单元格是向量而不是单个值,即列是列表而不是向量:

dt1 <- data.table(
  colA=   c('A1','A2','A3'), 
  colB=list('B1',c('B2a','B2b'),'B3'),
  colC=   c('C1','C2','C3'), 
  colD=   c('D1','D2','D3')
)

dt1
#   colA    colB colC colD
#1:   A1      B1   C1   D1
#2:   A2 B2a,B2b   C2   D2
#3:   A3      B3   C3   D3 
Run Code Online (Sandbox Code Playgroud)

我需要将其重新整理成一个长格式的列表colB.到目前为止我这样做:

dt1[,.(colB=unlist(colB)),by=.(colA,colC,colD)]
#   colA colC colD colB
#1:   A1   C1   D1   B1
#2:   A2   C2   D2  B2a
#3:   A2   C2   D2  B2b
#4:   A3   C3   D3   B3
Run Code Online (Sandbox Code Playgroud)

它完成了工作,但我不喜欢我必须明确指出所有其他列名称by=.有没有更好的方法来做到这一点?
(我确定它已经在其他地方得到了解答,但到目前为止我找不到它)

PS理想情况下我想管理没有任何外部包

r data.table

13
推荐指数
2
解决办法
1898
查看次数

来自档案的文件的fread()

我想知道data.table从存档文件中读取a的推荐方法是什么(在我的情况下是zip存档).一个显而易见的选择是将其解压缩到一个临时文件然后fread()像往常一样.我不想费心创建新的文件,所以不是我使用read.table()unz()连接,然后用它转换data.table():

mydt <- data.table(read.table(unz(myzipfilename, myfilename)))
Run Code Online (Sandbox Code Playgroud)

这工作正常,但read.table()大文件速度慢,而fread()无法unz()直接读取连接.我想知道是否有更好的解决方案.

r data.table

12
推荐指数
1
解决办法
4001
查看次数

`fill`比例未显示在图例中

这是我的虚拟代码:

set.seed(1)
df <- data.frame(xx=sample(10,6), 
                 yy=sample(10,6), 
                 type2=c('a','b','a','a','b','b'),
                 type3=c('A','C','B','A','B','C')
                 )
ggplot(data=df, mapping = aes(x=xx, y=yy)) + 
geom_point(aes(shape=type3, fill=type2), size=5) +
  scale_shape_manual(values=c(24,25,21)) +
  scale_fill_manual(values=c('green', 'red'))
Run Code Online (Sandbox Code Playgroud)

结果图有一个图例,但它的'type2'部分并不反映fill价值尺度- 它是否符合设计?

样本图

r ggplot2

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

标签 统计

r ×10

data.table ×5

ggplot2 ×2

reshape2 ×2

dataframe ×1

lapply ×1

melt ×1

reshape ×1