DF1是
ID CompareID Distance
1 256 0
1 834 0
1 946 0
2 629 0
2 735 1
2 108 1
预期输出应为DF2,如下所示(生成DF2的条件 - >在DF1中,对于任何ID,如果'距离' == 1,请将相应的' CompareID'放入& #39; SimilarID'列,对于'距离' == 0,忽略相应的' CompareID')
ID SimilarID
1 None
2 735,108
比较正确完成,但我得到了以下输出
ID SimilarID
1 ?
2 735,108
我明白了,因为没有' CompareID'放入' SimilarID' - ?标记显示。 我想替换这个'?'没有'没有'或' 0'。请帮助 在某些情况下,我观察到而不是'?'我也可以看到' NULL'值。
谢谢!
答案 0 :(得分:3)
使用 data.table 包,其中df
是您的原始数据......
library(data.table)
setDT(df)[, .(SimilarID = if(all(Distance == 0)) "None"
else toString(CompareID[Distance == 1])), by = ID]
# ID SimilarID
# 1: 1 None
# 2: 2 735, 108
这可以通过ID
"None"
列为零时Distance
CompareID
为1时的Distance
值,以逗号分隔的字符串数据:强>
df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), CompareID = c(256L,
834L, 946L, 629L, 735L, 108L), Distance = c(0L, 0L, 0L, 0L, 1L,
1L)), .Names = c("ID", "CompareID", "Distance"), class = "data.frame", row.names = c(NA,
-6L))
答案 1 :(得分:2)
使用dplyr
:
summarise.func <- function (Distance,CompareID) {
SimilarID <- CompareID[Distance == 1]
if (length(SimilarID)==0) "None" else paste0(SimilarID, collapse=",")
}
library(dplyr)
df2 <- df1 %>% group_by(ID) %>%
summarise(SimilarID=summarise.func(Distance,CompareID))
首先,定义一个总结函数summarise.func
:
CompareID
,则将SimilarID
提取到Distance == 1
向量。SimilarID
向量包含元素,则返回一个字符串,这些CompareID
已折叠为","
;否则返回"None"
。然后,将此summarise.func
用于summarise
SimilarID
分组ID
。
使用您的数据:
print(df2)
### A tibble: 2 x 2
## ID SimilarID
## <int> <chr>
##1 1 None
##2 2 735,108
答案 2 :(得分:0)
在基础R中使用aggregate
:
df2 <- aggregate((CompareID*Distance)~ID, df, FUN=function(x)
ifelse(sum(x)>0, paste(x[x>0], collapse = ","), "None"))
names(df2) <- c("ID", "SimilarID") #if necessary
# ID SimilarID
#1 1 None
#2 2 735,108
CompareID*Distance
可确保在CompareID
时忽略Distance==0
。此外,按ID
分组,如果sum
大于0
,则非零值(x[x>0]
)以逗号分隔,None
,否则