-1

これを回して、データ フレームの行をシャッフルする必要があります。

A foo
B bar
C baz

これに:

B foo
C bar
A baz

つまり、最初の列をシャッフルし、残りはそのままにしておく必要があります。ここで提案されているようsample()に、ライブラリから使用してこれを行っています。最小限の作業コードの例は次のとおりです。kimisc

>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", quote=F, sep='\t', col=FALSE)

これにより、次の出力が生成されます。

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

バニラを使用すると、sample生成されたデータ フレームは期待どおりに出力されますが、必要な方法でシャッフルされません (つまり、行ではなく列がシャッフルされます)。

では、データ フレームの列ではなく行サンプリングできるようにするためsampleにどのように使用できますか?kimiscwrite.tablebase::sample


PS.私は実際に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")
4

1 に答える 1

1

あなたの入力を再現可能な例に作り直しました:

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。考えられる 2 つの解決策:

  • 通話names$V1で使用transform
  • namesテーブルとしてではなく、ベクトルとして読み取ります (注意してくださいnrow(names))
于 2013-08-28T17:04:37.683 に答える