我是R的初学者,遇到一些基本的问题,但我不确定该怎么做。我有一个包含1319行的数据集,我想为观察值1到1000设置训练数据,为1001到1319设置测试数据。
与我班和教授的笔记相比较,通过在她的数据中使用“ Year”变量对布尔向量进行设置来进行设置。例如:
train=(Year<2005)
然后返回True / False语句。
我了解这一点,并且如果我通过变量对数据进行子集设置,则能够设置布尔向量,但是我必须严格按照我不知道如何完成操作的行数进行设置。我尝试过
train=(data$nrow < 1001)
但是结果是逻辑(0)。
有人可以引导我朝正确的方向吗?
答案 0 :(得分:0)
您得到logical(0)
是因为nrow
不是一列
您还可以通过使用行号来子集数据框
train = 1:1000 # vector with integers from 1 to 1000
test = 1001:nrow(data)
train_data = data[train,]
test_data = data[test,]
但是要小心,除非数据框中的行顺序是完全随机的,否则您可能希望随机获得1000行而不是前1000行,您可以使用
train = sample(1:nrow(data),1000)
然后您可以使用来获取train_data
和test_data
train_data = data[train,]
test_data = data[setdiff(1:nrow(data),train),]
setdiff
函数用于获取火车中所有未选择的行
答案 1 :(得分:0)
按行划分数据集的问题是有可能在训练和测试集中引入偏见,尤其是对于有序数据。
# Create a data set
data <- data.frame(year = sample(seq(2000, 2019, by = 1), 1000, replace = T),
data = sample(seq(0, 1, by = 0.01), 1000, replace = T))
nrow(data)
[1] 1000
如果您真的想获取前n行,则可以尝试:
first.n.rows <- data[1:1000, ]
caret
软件包为在模型中使用交叉验证提供了一种更可靠的方法。
首先创建分区规则:
library(caret)
inTrain <- createDataPartition(y = data$year,
p = 0.8, list = FALSE)
请注意,y = data$year
告诉R使用变量year
进行采样,以确保您不会获得有序数据,并且不会对模型造成偏差。
p
自变量告诉插入符号应将多少原始数据划分为训练集,在这种情况下为80%。
然后将分区应用于数据集:
# Create the training set
train <- data[inTrain,]
# Create the testing set
test <- data[-inTrain,]
nrow(train) + nrow(test)
[1] 1000