您好我有面板数据,并希望删除任何只在一个时间点进行观察的人,并保留那些有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
答案 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)