在R中创建3行的随机组

时间:2015-10-07 02:18:28

标签: r split dplyr sample

我尝试从数据集中创建尽可能多的随机组。我的数据有点难以解释,所以我会使用iris作为我的例子。

iris中,Species变量包含3个唯一值:setosaversicolorvirginica

  1. 我想将数据集随机化并分组为3行组,每组只包含唯一的物种。 (例如每个物种中的1个)

  2. 每个小组必须有cumsum(Sepal.Width >= 10)

  3. 创建一个标识每个组的新ID

  4. 到目前为止,我已尝试使用 dplyr 函数group_by()sample_n()。另外split()sample(),但似乎无法获得所需的结果。

    使用split()我认为这可能是错误的做法。我试图让它沿着这些方向运转而没有运气。

    split(unique(iris), sample(1:nrow(iris) %/% 3))
    

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

public boolean findPrefix(String Prefix){
        return findBinaryPrefix(listOfWords, Prefix,0, listOfWords.size()-1, 0);
    }

    /**
     * Helper function for findPrefix.
     * @param list arraylist
     * @param prefix prefix you want to find
     * @param low lowest index
     * @param high highest index of the array.
     * @return returns true if prefix is in the dictionary, else false.
     */
    private boolean findBinaryPrefix(ArrayList<String> list, String prefix, int low, int high, int prefixLength){
        int charCounter = prefixLength;

        if(low>high){
            return false;
        }
        int mid = (low+high)/2;
        if(list.get(mid).substring(0, charCounter).equals(prefix.substring(0, charCounter))){
            //If the word is equal, then that's the base case.
            return true;
        }

        else if (list.get(mid).substring(0, charCounter).compareTo(prefix.substring(0, charCounter)) < 0){
            return findBinaryPrefix(list, prefix, mid+1, high, charCounter);
        }
        else
            return findBinaryPrefix(list, prefix, low, mid-1, charCounter);
    }


private ArrayList<String> generateWords(Dictionary dict,String prefix, String seq){


        if(seq.length() == 0){
            if(dict.findWord(prefix)){
                permList.add(prefix);
            }

        }
        else{
            for(int i = 0;i<seq.length(); i++){
                if(!dict.findPrefix(prefix)){break;}
                //if prefix is not even in dictionary, don't bother generating.

                //generate permutations when the character is in a different position with each iteration of the loop.
                generateWords(dict, prefix + seq.charAt(i) ,seq.substring(0,i) + seq.substring(i+1, seq.length()));
            }
        }

        return permList;
    }

答案 1 :(得分:0)

我想我理解了这个问题。以下是使用dplyr

的方法

首先,加载一些包并为iris data.frame中的每一行添加唯一ID。

library(dplyr)
library(tidyr)
iris = iris %>% mutate(Row.ID=1:n())

然后,让我们根据物种分割Row.ID,并获得一个data.frame,其中包含每个物种的一行的所有可能组合

iris_split = split(iris$Row.ID, iris$Species)
combinations = do.call(expand.grid, iris_split)

现在,它是dplyrtidyr时间。让我们在名为tmp的变量中收集这些组合,将tmp加入iris data.frame的其余部分,然后根据条件进行过滤。

tmp = combinations %>%
    mutate(Group.ID=1:n()) %>%
    gather(Var, Row.ID, -Group.ID) %>%
    select(-Var)

result = iris %>%
    inner_join(tmp) %>%
    group_by(Group.ID) %>%
    filter(sum(Sepal.Length) > 10) %>%
    arrange(Group.ID)

result data.frame应该是您正在寻找的。