data.frame中重复值之间的采样函数

时间:2014-04-15 13:00:19

标签: r function dataframe sample duplicate-data

所以,我有一个名为“DATA”的data.frame对象。 该对象包含一个名为“Point”的列(DATA $ Point)。由于此特定列上有一些重复项,因此我想构建一个函数,在DATA中仅对这些重复项中的一行进行采样。

我一直试图这样做:

sort.song<-function(DATA){

 Point<-levels(DATA$Point)
 DATA.NEW<-DATA[1:length(Point),] 

#Ideally DATA.NEW should have an empty dataframe with nrow=length(Point) and the same columns
#as in DATA. But I THINK it will work (I don't know how to do the "ideally" way)

 for(i in 1:dim(DATA)[1]){ #dim(DATA)[1] always bigger than length(Point)
  SUBDATA<-DATA[which(DATA$Point%in%Point[i]),]

#I need to sample one row of the original data set only of the duplicates of the same value.
#So if there isn't a duplicate of one particular value, move on. Otherwise sample one between
#those duplicates.

  l<-dim(SUBDATA)[1]
  if (l==1){DATA.NEW[i,]<-SUBDATA[l,]}else{lc<-sample(1:l,1)}
  DATA.NEW[i,]<-SUBDATA[lc,]
  }
 return(DATA.NEW)
}

test<-sort.song(DATA)

但它不起作用! :( 我收到以下错误消息:

Error in `[<-.factor`(`*tmp*`, iseq, value = integer(0)) : 
replacement has length zero

这可能是一个愚蠢的问题,但我在这里没有选择(总R初学者)

任何帮助都将受到高度赞赏!!!!

3 个答案:

答案 0 :(得分:0)

R内置了函数sampleduplicated。因此,您只需使用

即可
DATA[ sample( !duplicated(DATA$Point), N ), ]
# where `N` is the sample size you'd like. 

在data.table语法中,上面的内容是

DATA[ sample( !duplicated(Point), N )]

答案 1 :(得分:0)

那么你想要每一个没有重复的行和那些重复的那些行吗?

然后试试这个:

# build fake dataset
DATA <- as.data.frame(cbind(sample(c(1:10,3:7)),sample(1:15),sample(1:15)))
names(DATA) <- c("Point","some_col","some_other_col")

# check
print(DATA) # See Point has duplicate values


# your function
filter_data <- function(DATA){
distinct_points <- unique(DATA$Point)
as.data.frame(t(sapply(distinct_points, function(x){subset(DATA,Point == x)[1,]})))
}


#result
DATA.new <- filter_data(DATA)
print(DATA.new)

答案 2 :(得分:0)

如果你想选择一个随机副本来保留,而不是duplicated只保留第一个的默认行为,那么为什么不随机改组整个数据集,以便选择洗牌集中的第一个是有效的来自原始的随机行:

DATAr <- DATA[sample(1:nrow(DATA),]
DATAr <- DATAr[!duplicated(DATAr$Point),]

如果原始DATA的顺序是重要的,请将sample(...)存储在变量中,使用它来重新排序数据,并在删除重复项后应用反转(或添加列{{ 1}}并对数据进行排序以便以后恢复。