select 逐行复制两列并在 R 中创建一个新变量
select duplicates from two columns by row and create a new variable in R
我有一个数据框,其中有不同的 ID 和日期副本。我只想检测另一列中的一列重复项,所以我可以说:
1. 删除 T 中具有重复 ID、重复日期和缺失的行(此 table 中的第二条记录)。
2. 然后说:如果有重复的id和重复的日期,就选T=="high".
id<-c("a", "a", "a", "a", "b", "c")
datee<-c("12/02/10", "12/02/10", "12/02/10","10/03/11", "10/04/18","1/04/18" )
T<-c("high", NA, "low","high", "low", "medium")
mydata<-data.frame(id, datee, T)
这是这样的:
id datee T
a 12/02/10 high
a 12/02/10 <NA>
a 12/02/10 low
a 10/03/11 high
b 10/04/18 low
c 1/04/18 medium
你可以先这样做:
is_duplicate <- lapply(X = mydata, FUN = duplicated, incomparables = FALSE)
is_na <- lapply(X = mydata, FUN = is.na)
并使用 data.frames 到 f.ex。删除具有重复 ID、重复日期和 T 中缺失的行,如下所示:
drop_idx <- which(is_duplicate$id & is_duplicate$datee & is_na$T)
data[drop_idx, ]
一步一步的解决方案
第 1 步 - 删除缺失
mydata<-mydata[!is.na(mydata[,3]),]
第 2 步 - 识别 ID 上的重复行
dup_rows_ID<-duplicated(mydata[,c(1)],fromLast = TRUE) | duplicated(mydata[,c(1)],fromLast = FALSE)
mydata_dup<-mydata[dup_rows_ID,]
第 3 步 - 在 ID 和 datee 上标识重复的行
dup_rows_ID_datee<-duplicated(mydata_dup[,c(1,2)],fromLast = TRUE) | duplicated(mydata_dup[,c(1,2)],fromLast = FALSE)
第 4 步 - Select T="high"
mydata_dup2<-mydata_dup[mydata_dup[dup_rows_ID_datee,"T"]=="high",]
你的输出
rbind(mydata_dup[rownames(mydata_dup) %in% rownames(mydata_dup2),],
+ mydata[!dup_rows_ID,])
id datee T
1 a 12/02/10 high
4 a 10/03/11 high
5 b 10/04/18 low
6 c 1/04/18 medium
关于ID==a你有两个与T=="high"的约会对象,你必须选择是要约会对象大的还是小的。
我有一个数据框,其中有不同的 ID 和日期副本。我只想检测另一列中的一列重复项,所以我可以说: 1. 删除 T 中具有重复 ID、重复日期和缺失的行(此 table 中的第二条记录)。 2. 然后说:如果有重复的id和重复的日期,就选T=="high".
id<-c("a", "a", "a", "a", "b", "c")
datee<-c("12/02/10", "12/02/10", "12/02/10","10/03/11", "10/04/18","1/04/18" )
T<-c("high", NA, "low","high", "low", "medium")
mydata<-data.frame(id, datee, T)
这是这样的:
id datee T
a 12/02/10 high
a 12/02/10 <NA>
a 12/02/10 low
a 10/03/11 high
b 10/04/18 low
c 1/04/18 medium
你可以先这样做:
is_duplicate <- lapply(X = mydata, FUN = duplicated, incomparables = FALSE)
is_na <- lapply(X = mydata, FUN = is.na)
并使用 data.frames 到 f.ex。删除具有重复 ID、重复日期和 T 中缺失的行,如下所示:
drop_idx <- which(is_duplicate$id & is_duplicate$datee & is_na$T)
data[drop_idx, ]
一步一步的解决方案
第 1 步 - 删除缺失
mydata<-mydata[!is.na(mydata[,3]),]
第 2 步 - 识别 ID 上的重复行
dup_rows_ID<-duplicated(mydata[,c(1)],fromLast = TRUE) | duplicated(mydata[,c(1)],fromLast = FALSE)
mydata_dup<-mydata[dup_rows_ID,]
第 3 步 - 在 ID 和 datee 上标识重复的行
dup_rows_ID_datee<-duplicated(mydata_dup[,c(1,2)],fromLast = TRUE) | duplicated(mydata_dup[,c(1,2)],fromLast = FALSE)
第 4 步 - Select T="high"
mydata_dup2<-mydata_dup[mydata_dup[dup_rows_ID_datee,"T"]=="high",]
你的输出
rbind(mydata_dup[rownames(mydata_dup) %in% rownames(mydata_dup2),],
+ mydata[!dup_rows_ID,])
id datee T
1 a 12/02/10 high
4 a 10/03/11 high
5 b 10/04/18 low
6 c 1/04/18 medium
关于ID==a你有两个与T=="high"的约会对象,你必须选择是要约会对象大的还是小的。