2013-08-28 30 views
0

我需要洗牌的数据帧的行,把这样的:R:打印使用样本创建的数据帧()从kimisc库

A foo 
B bar 
C baz 

成这样:

B foo 
C bar 
A baz 

即,第一列应该洗牌,同时保持其余的完整。我正在使用库中的sample()来建议here。一个最小的工作代码示例:

>df<-read.table("file1", header=F, skip=1) 
>library(kimisc) 
>names<-read.table("file2") 
>df1<- transform(sample(df,size=nrow(names)),V1=names) 
>df1 
    V1 V2 
5 A 21266 
8 C 22109 
7 F 17971 
1 J 11137 

哪里file1

Name Value 
A 28463 
B 11137 
C 24966 
D 24611 
E 14980 
F 21266 
G 23441 
H 17971 
I 22109 
J 31746 

file2是:

A 
C 
F 
J 

然后我想写这个数据帧到一个文件和我的预期输出是

A 21266 
C 22109 
F 17971 
J 11137 

然而,装载kimisc库提供了自己的sample功能(不同于香草)打乱数据帧我想它的方式,但似乎搞砸了打印:

write.table(DF1,” file3" 的,报价= F,九月= '\ t' 的COL = FALSE)

这将产生以下输出:

5 1:4 21266 
8 1:4 22109 
7 1:4 17971 
1 1:4 11137 

如果我使用香草sample,数据帧生成的是按预期方式打印的,但不按照我需要的方式打乱(即,列而不是行被混洗)。

所以,我该如何使用从kimiscsample,让我品尝,而不是数据帧的列,仍然在路上write.table将与base::sample返回的数据帧打印工作呢?


PS.I正在使用的名单,因为我其实是想从包含143558041线在该文件中提到的名字的一个子集(39953)的文件分配随机值。


按照要求,中dput(df1)输出

> dput(df1) 
structure(list(V1 = structure(list(V1 = structure(1:4, .Label = c("A", 
"C", "F", "J"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c(NA, 
-4L)), V2 = c(24611L, 14980L, 22109L, 21266L)), .Names = c("V1", 
"V2"), row.names = c(3L, 4L, 8L, 5L), class = "data.frame") 
+0

能否请您发表dput的'输出(DF1 )'? – krlmlr

+0

@krlmlr感谢您的帮助,我添加了您请求的输出。它看起来像你的示例函数返回链接到被抽样对象的特定行的列表,这是否正确? – terdon

回答

1

我已经重新设计你的输入到reproducible example

library(kimisc) 

## Loading required package: Rcpp 

## Loading required package: logging 


set.seed(20130828L) 

df <- read.table(text="Name Value 
A 28463 
B 11137 
C 24966 
D 24611 
E 14980 
F 21266 
G 23441 
H 17971 
I 22109 
J 31746", header=F, skip=1) 

names <- read.table(text="A 
C 
F 
J") 

df.s <- sample.data.frame(df,size=nrow(names)) 
df1<- transform(df.s,V1=names) 

dput(df1) 

## structure(list(V1 = structure(list(V1 = structure(1:4, .Label = c("A", 
## "C", "F", "J"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c(NA, 
## -4L)), V2 = c(14980L, 21266L, 17971L, 24966L)), .Names = c("V1", 
## "V2"), row.names = c(5L, 6L, 8L, 3L), class = "data.frame") 

正如你所看到的,所产生的dput输出类似于你的。

实际上,names是嵌入到另一个数据帧中的数据帧。这与sample.data.frame中的问题无关。两种可能的补救措施:

  • 使用names$V1transform电话
  • names作为载体,而不是作为一个表(小心nrow(names)
+0

唉!谢谢,使用'name $ V1'完美地工作,并再次感谢您的包裹,这正是我所需要的。为了改进任何未来的问题,如果我理解了你正确链接的问题,“可重现的例子”就是包含种子的一个例子,如果使用随机过程,并且数据直接加载到代码中而不需要外部文件。所以我应该避免使用文件,而是在最小的例子中对数据进行硬编码? – terdon

+2

@terdon:是的,如果想要回答的人只需粘贴并运行代码,就会容易得多。我用['soR'](https://github.com/krlmlr/scriptlets/blob/master/soR)脚本生成了我的输出。 – krlmlr