我对编程很陌生,而且我刚刚开始使用R,但是还没有能够让更有经验的用户回答这个问题。所以希望这对其他人也有用。
我的数据集由按0到4的整数分类的项(行)组成, 它代表我的离散变量的度数。我有两年的数据,1980年,然后是1996年(专栏)。在此期间,项目可以在该期间保持相同的类别,或者在两个方向上分级为其他度数。例如:
1980 1996
a) 1 1
b) 2 4
c) 4 1
我想要做的是为中间年份生成虚拟数据:
这意味着当我将实际时期从1980年至1996年分成多个虚拟数据集时,我可以得到1980-1984-1988-1992-1996:
1980 1984 1988 1992 1996
a) 1 1 1 1 1
b) 2 2 3 4 4
c) 4 4 3 2 1
或:
1980 1984 1988 1992 1996
a) 1 1 1 1 1
b) 2 3 3 3 4
c) 4 3 2 2 1
我可以使用随机数生成器,但我的项目无法跳转类别或更改放坡方向。因此,例如,如果项目d)从1升级到4,我的虚拟数据集只能是四个选项之一:
1980 1984 1988 1992 1996
d) 1 1 2 3 4
d) 1 2 2 3 4
d) 1 2 3 3 4
d) 1 2 3 4 4
它不能
1980 1984 1988 1992 1996
d) 1 2 1 4 4
,也不
1980 1984 1988 1992 1996
d) 1 1 1 3 4
如何生成虚拟数据帧,遵循允许其在现实中保持基础的特定条件?
非常感谢任何帮助或建议。
答案 0 :(得分:0)
> set.seed(2017)
>
> df <- data.frame(x1984 = c(1,2,4), x1996 = c(1,4,1))
> df
x1984 x1996
1 1 1
2 2 4
3 4 1
>
> df$x1988 <- df$x1984 + c(sample(0:1,1),sample(0:1,1), sample(0:1,1) )
> df$x1992 <- df$x1988 + c(sample(0:1,1),sample(0:1,1), sample(0:1,1) )
>
> df <- df[,order(names(df))]
>
> df
x1984 x1988 x1992 x1996
1 1 2 2 1
2 2 3 4 4
3 4 4 5 1
答案 1 :(得分:0)
给出矩阵myMat,
myMat <- matrix(c(1, 2, 4, 1, 4, 1), 3)
您可以将apply
和approx
与ceiling
一起使用,如下所示:
t(apply(myMat, 1, function(x) ceiling(approx(x=x, n=5)$y)))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 2 3 3 4 4
[3,] 4 4 3 2 1
ceiling
用于转换为整数。如果需要,您可以将其替换为floor
或round
。要转换为data.frame,您可以将输出包装在data.frame
中,并可以使用setNames
添加名称。
setNames(data.frame(t(apply(myMat, 1, function(x) ceiling(approx(x=x, n=5)$y)))),
seq(1980, 1996, 4))
返回
1980 1984 1988 1992 1996
1 1 1 1 1 1
2 2 3 3 4 4
3 4 4 3 2 1
答案 2 :(得分:0)
您可以尝试这样
df <- read.table(text = "
1980 1996
1 1
2 4
4 1", header = T)
df.new <- data.frame(X1980 = NULL, X1984 = NULL, X1988 = NULL, X1992 = NULL, X1996 = NULL)
for(i in 1:nrow(df)){
lst <- ifelse(df$X1980[i] > df$X1996[i],
list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = T)),
list(sort(sample(df$X1980[i]:df$X1996[i],3,replace = T), decreasing = F)))
lst <- c(df$X1980[i], unlist(lst), df$X1996[i])
df.new <- rbind(df.new, data.frame(X1980 = lst[1],
X1984 = lst[2],
X1988 = lst[3],
X1992 = lst[4],
X1996 = lst[5]))
}
df.new
X1980 X1984 X1988 X1992 X1996
1 1 1 1 1 1
2 2 3 4 4 4
3 4 4 3 2 1