两种相同类型的数据框在功能上的表现不同

时间:2018-08-11 15:43:02

标签: r

下面是我的数据

set.seed(100)
toydata <- data.frame(A = sample(1:50,50,replace = T),
                      B = sample(1:50,50,replace = T),
                      C = sample(1:50,50,replace = T)

)

下面是我的交换功能

derangement <- function(x){
  if(max(table(x)) > length(x)/2) return(NA)
  while(TRUE){
    y <- sample(x)
    if(all(y != x)) return(y)
  }
}

swapFun <- function(x, n = 10){
  inx <- which(x < n)
  y <- derangement(x[inx])
  if(length(y) == 1) return(NA) 
  x[inx] <- y
  x
}

在第一种情况下,我通过交换整个数据帧来获取新数据toy。代码如下:

toydata<-as.matrix(toydata)
toy<-swapFun(toydata)
toy<-as.data.frame(toy) 

在第二种情况下,我分别通过交换每一列来获取新数据toy。下面是代码:

toydata<-as.data.frame(toydata)
toy2 <- toydata    # Work with a copy
toy2[] <- lapply(toydata, swapFun)
toy<-toy2

以下是交换后可以输出邻接表差异的功能。

# the function to compare contingency tables
f = function(x,y){
  table1<-table(toydata[,x],toydata[,y])
  table2<-table(toy[,x],toy[,y])
  sum(abs(table1-table2))
}

# vectorise your function
f = Vectorize(f)


combn(x=names(toydata),
      y=names(toydata), 2) %>%# create all combinations of your column names
      t() %>%                                  # transpose
      data.frame(., stringsAsFactors = F) %>%  # save as dataframe
      filter(X1 != X2) %>%                     # exclude pairs of same 
                                           # column
      mutate(SumAbs = f(X1,X2))                # apply function

在第二种情况下,此mutate函数有效。

但是在第一种情况下,此mutate函数不起作用。它说:

+   filter(X1 != X2) %>%                     # exclude pairs of same column
+   mutate(SumAbs = f(X1,X2))                # apply function
Error in combn(x = names(toydata), y = names(toydata), 2) : n < m 

但是,在两种情况下,toy数据都是具有相同维,相同行名和相同列名的所有数据帧。我感到困惑。

我该如何解决?谢谢。

0 个答案:

没有答案