在指定条件下在R中生成虚拟数据

时间:2017-11-01 16:04:46

标签: r

我对编程很陌生,而且我刚刚开始使用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

如何生成虚拟数据帧,遵循允许其在现实中保持基础的特定条件?

非常感谢任何帮助或建议。

3 个答案:

答案 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)

您可以将applyapproxceiling一起使用,如下所示:

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用于转换为整数。如果需要,您可以将其替换为floorround。要转换为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