Не нужно использовать цикл. Вы можете использовать подход data.table
, который будет более эффективным и быстрым.
library(data.table)
# create a column with row positions
setDT(dt)[, rowpos := .I]
# save each line of your dataset into a separate .csv file
dt[, write.csv(.SD, paste0("output_", rowpos,".csv")),
by = rowpos, .SDcols=names(dt) ]
Делать вещи намного быстрее
# Now in case you're working with a large dataset and you want
# to make things much faster, you can use `fwrite {data.table}`*
dt[, fwrite(.SD, paste0("output_", rowpos ,".csv")),
by = rowpos, .SDcols=names(dt) ]
Использование Loop
# in case you still want to use a loop, this will do the work for you:
for (i in 1:nrow(dt)){
write.csv(dt[i,], file = paste0("loop_", i, ".csv"))
}
Дополнительно: сохранение подмножеств dataframe
по группам вместо строк
# This line of code will save a separate `.csv` file for every ID
# and name the file according to the ID
setDT(dt)[, fwrite(.SD, paste0("output_", ID,".csv")),
by = ID, .SDcols=names(dt) ]
* ps. обратите внимание, что fwrite
все еще находится в версии разработки data.table 1.9.7
. Go здесь для инструкций по установке.
Вы должны ссылаться на полное ограничение PK, вы не можете просто ссылаться на один столбец, даже если вы делаете это для двух столбцов отдельно.
Вам нужно создать одиночный Ограничение FK, ссылающееся на на оба столбца :
CREATE TABLE Metal (
Mstuff VARCHAR(40) NOT NULL,
SubthingID INTEGER NOT NULL,
consists_of INTEGER NOT NULL,
foreign key (SubthingID, consists_of)
references subthing (SubthingID, consists_of) --<< ONE constraint with TWO columns
PRIMARY KEY (SubthingID, consists_of)
);