所以,我有一个名为“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初学者)
任何帮助都将受到高度赞赏!!!!
答案 0 :(得分:0)
R
内置了函数sample
和duplicated
。因此,您只需使用
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}}并对数据进行排序以便以后恢复。