删除少于三次独特观察的群组

时间:2016-06-15 12:33:41

标签: r subset r-faq

我想将数据框的子集设置为仅保留在不同日期有3个或更多观察值的组。我想摆脱少于3次观察的群体,或者他们所拥有的观察不是来自3个不同的日子。

以下是一个示例数据集:

Group   Day
1       1 
1       3
1       5
1       5
2       2
2       2  
2       4 
2       4
3       1
3       2
3       3
4       1
4       5

因此,对于上面的示例,将保留组1和组3,并且将从数据帧中删除组2和组4。

我希望这是有道理的,我想解决方案将非常简单,但我无法解决(我对R来说很陌生,而且对于像这样的事情提出解决方案的速度不是很快)。我想也许diff功能可以派上用场,但没有进一步的发展。

3 个答案:

答案 0 :(得分:6)

使用Url.Action,您可以:

data.table

给出:

library(data.table)
DT[, if(uniqueN(Day) >= 3) .SD, by = Group]

Group Day 1: 1 1 2: 1 3 3: 1 5 4: 1 5 5: 3 1 6: 3 2 7: 3 3

dplyr

给出相同的结果。

答案 1 :(得分:5)

使用dplyr

的一个想法
 library(dplyr)
 df %>% 
   group_by(Group) %>% 
   filter(length(unique(Day)) >= 3)

#Source: local data frame [7 x 2]
#Groups: Group [2]

#  Group   Day
#  (int) (int)
#1     1     1
#2     1     3
#3     1     5
#4     1     5
#5     3     1
#6     3     2
#7     3     3

答案 2 :(得分:4)

我们可以使用i1 <- rowSums(table(df1)!=0)>=3 subset(df1, Group %in% names(i1)[i1]) # Group Day #1 1 1 #2 1 3 #3 1 5 #4 1 5 #9 3 1 #10 3 2 #11 3 3

base R

或者单行df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),] 将是

public class DataBaseHelper extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "bazaFire.db";
private static final String TABLE_NAME = "Messages";
private static final String COLUMN_NAME="message_body";
private SQLiteDatabase myDB;
public DataBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL("CREATE TABLE " + TABLE_NAME
            + "(id INTEGER PRIMARY KEY AUTOINCREMENT, message_body TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);

}
public void insertMsg(String msg) {

    SQLiteDatabase db = getWritableDatabase();
    Log.d("getWritable", "Okay");

    ContentValues cv = new ContentValues();

    cv.put(COLUMN_NAME, msg);
    Log.d("Stavljena", msg);

    db.insert(TABLE_NAME, null, cv);

    db.close();

}
public Cursor query(String table, String[] columns, String selectionArgs, String groupBy, String having, String orderBy){
    return myDB.query("Messages", null, null, null, null, null, null);
}