R- data.table中的组的随机样本

时间:2018-05-14 17:50:59

标签: r data.table

我如何随机抽样,例如data.table中的三个组,以便结果包含三个组,其中包含原始data.table中的所有行?

<com.google.android.material.tabs.TabLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabInlineLabel="true"
    app:tabMode="scrollable"
    app:tabGravity="fill">

    <com.google.android.material.tabs.TabItem
        style="@style/Widget.MaterialComponents.TabLayout.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_attach_money_black_24dp"
        android:text="Selected" />
    <com.google.android.material.tabs.TabItem
        style="@style/Widget.MaterialComponents.TabLayout.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_attach_money_black_24dp" />
    <com.google.android.material.tabs.TabItem
        style="@style/Widget.MaterialComponents.TabLayout.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_attach_money_black_24dp"
        />
    <com.google.android.material.tabs.TabItem
        style="@style/Widget.MaterialComponents.TabLayout.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_attach_money_black_24dp" />
    <com.google.android.material.tabs.TabItem
        style="@style/Widget.MaterialComponents.TabLayout.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:icon="@drawable/ic_attach_money_black_24dp"
        />

</com.google.android.material.tabs.TabLayout>

我知道如何从data.table中随机选择10行:

library(data.table)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, 
replace=TRUE))

以及如何按组进行抽样

dat.sampl1 <- as.data.table(sapply(dat[], sample, 10))

但如何随机抽样组?所以结果应该是这样的:

dat[,.SD[sample(.N, min(.N,3))], by = groups]

2 个答案:

答案 0 :(得分:3)

你的意思是:

onClick

如果您想使用替换组进行抽样,您可以执行以下操作,其中set.seed(123) dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, replace=TRUE)) dat[groups %in% sample(unique(dat[, groups]), size = 3)][order(groups)] # ids groups # 1: 3 C # 2: 10 C # 3: 12 C # 4: 7 D # 5: 9 D # 6: 14 D # 7: 4 F # 8: 5 F # 9: 8 F # 10: 11 F # 11: 16 F # 12: 20 F 已被采样两次:

A

答案 1 :(得分:1)

此代码可以使用%in%使用单行基本R代码来检查使用sample函数生成的索引:

df1[df1[,'groups'] %in% sample(unique(df1[,'groups']), size = 3, replace = F), ]

例如:

> df1 <- data.frame("ids" = 1:20, "groups" = sample(LETTERS[1:4], size = 20, replace = T))
> df2 <- df1[df1[,'groups'] %in% sample(unique(df1[,'groups']), size = 3, replace = F), ]
> df2[order(df2[,'groups']),]
   ids groups
4    4      B
6    6      B
18  18      B
20  20      B
1    1      C
2    2      C
3    3      C
9    9      C
12  12      C
16  16      C
19  19      C
7    7      D
11  11      D