在r

时间:2016-04-21 08:28:36

标签: r

您好我有面板数据,并希望删除任何只在一个时间点进行观察的人,并保留那些有2个时间点的人。

所以数据框:

df <- data.frame(id = c(1,2,2,3,3,4,4,5,6), time = c(1,1,2,1,2,1,2,2,2))

   id time
1  1    1
2  2    1
3  2    2
4  3    1
5  3    2
6  4    1
7  4    2
8  5    2
9  6    2

成为这个:

   id time
1  2    1
2  2    2
3  3    1
4  3    2
5  4    1
6  4    2

即移除个别1,5和6以使面板受到阻碍。 THX

4 个答案:

答案 0 :(得分:2)

我们可以使用几个选项来做到这一点。使用data.table,转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),按&#39; id&#39;分组,我们获得大于1的行数(.N)和if,获取数据子集。表(.SD

library(data.table)
setDT(df)[, if(.N>1) .SD, by = id]
#   id time
#1:  2    1
#2:  2    2
#3:  3    1
#4:  3    2
#5:  4    1
#6:  4    2

可以使用与dplyr相同的方法。

library(dplyr)
df %>% 
   group_by(id) %>%
   filter(n()>1)
#    id  time
#   (dbl) (dbl)
#1     2     1
#2     2     2
#3     3     1
#4     3     2
#5     4     1
#6     4     2

或者使用base R,获取data.frame的table,检查它是否大于1,根据逻辑索引对names进行子集(&#39; i1&# 39;)并将其用于subset数据框架&#39;使用%in%

 i1 <- table(df$id)>1
 subset(df, id %in% names(i1)[i1] )

答案 1 :(得分:1)

另一种选择,

CREATE VIEW view1
AS
SELECT 1 AS [Test1]

CREATE VIEW view2
AS
SELECT 2 AS [Test2]

CREATE FUNCTION dbo.fn_ReturnViewName (@Id INTEGER) 
RETURNS NVARCHAR(50)
AS
BEGIN
    RETURN 
      CASE WHEN @Id = 1 THEN 'view1' WHEN @Id = 2 THEN 'view2' ELSE '' END
END


CREATE PROCEDURE MyViewProc (@ViewId INTEGER)  
AS

DECLARE @SQL AS NVARCHAR(MAX)
DECLARE @Name AS NVARCHAR(50)
SET @Name = (SELECT dbo.fn_ReturnViewName(@ViewId))
SET @SQL = N'

            SELECT *
            FROM ' + @Name

            EXEC sp_executesql 
            @stmt = @SQL; 

EXEC MyViewProc @ViewID =1
EXEC MyViewProc @ViewID =2

答案 2 :(得分:1)

library(data.table)
setDT(df, key = "id")[(duplicated(id) | duplicated(id, fromLast = TRUE))]
#   id time
#1:  2    1
#2:  2    2
#3:  3    1
#4:  3    2
#5:  4    1
#6:  4    2

答案 3 :(得分:0)

您可以使用dplyr包来执行此操作

 library(dplyr)
    df %>% group_by(id,time) %>% summarize(count = n()) %>%
           filter(!count == 1)