如何替换NULL /?没有'没有'或者' 0' 0在r

时间:2016-10-03 20:47:21

标签: r dataframe null

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'值。

谢谢!

3 个答案:

答案 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

  1. 如果CompareID,则将SimilarID提取到Distance == 1向量。
  2. 如果此SimilarID向量包含元素,则返回一个字符串,这些CompareID已折叠为",";否则返回"None"
  3. 然后,将此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,否则