(这一定是一个非常基本的问题,但到目前为止我没有在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
参数)和其他一些参数?
我经常需要转换一个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) 我需要通过列号而不是名称来绘制带有寻址变量的散点图,即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)
Run Code Online (Sandbox Code Playgroud)# Error in eval(expr, envir, enclos) : object 'dat' not found
如果我理解正确,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) 我需要将我的宽表重新整形为长格式,但为每条记录保留多个字段,例如:
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) 我想重塑我的数据帧从长格式到宽格式,我放弃了一些我想保留的数据.对于以下示例:
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) (问题不再相关,因为data.table
25-NOV-2016的新版本- 见下面接受的答案)
所以,我有一张桌子,中间有一些空行.当我试图打开它时fread
,它会停下来说Stopped reading at empty line 10006, but text exists afterwards (discarded)
.有没有办法在不更改数据文件的情况下避免这种情况?
在我的表中,一些单元格是向量而不是单个值,即列是列表而不是向量:
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理想情况下我想管理没有任何外部包
我想知道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()
直接读取连接.我想知道是否有更好的解决方案.
这是我的虚拟代码:
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
价值尺度- 它是否符合设计?