R: напечатать фрейм данных, созданный с помощью sample() из библиотеки kimisc
Мне нужно перетасовать строки кадра данных, изменив это:
A foo
B bar
C baz
в это:
B foo
C bar
A baz
I.e., первый столбец следует перетасовать, сохраняя остальное неповрежденным. Я делаю это, используя 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
Если я использую vanilla sample
, генерируемый кадр данных печатается, как ожидалось, но он не перетасовывается так, как мне нужно (т.е. столбцы вместо строк перетасовываются).
Итак, как я могу использовать sample
из kimisc
, что позволяет мне пробовать строки, а не столбцы кадра данных, и все равно печатать их так, как write.table
будет работать с фреймом данных, возвращаемым base::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")
Ответы
Ответ 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
. Два возможных средства:
- Используйте
names$V1
в вызове transform
- Прочитайте
names
как вектор, а не как таблицу (осторожно с nrow(names)
)