2016-10-03 83 views
2

DF1是如何替換NULL /?在R '無' 或 '0'

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' 變成 'SimilarID' 列中, '距離' == 0,則忽略相應的 'CompareID')

ID SimilarID 
    1 None 
    2 735,108 

比較正確地完成,但我得到以下輸出

ID SimilarID 
    1 ? 
    2 735,108 

我明白了,因爲沒有'CompareID'放入'SimilarID' - ?標記被顯示。 我想替換這個'?' '無'或'0'。請幫助 在某些情況下,我觀​​察到,而不是'?'我也可以看到'NULL'值。

謝謝!

回答

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值爲Distance爲1,作爲逗號分隔的字符串

數據:

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)) 
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被忽略。此外,如果sum大於0,則將其分組爲ID,否則,非零值(x[x>0])以逗號分隔,None

+0

它不直接比較的列數據,我已經做了很多處理進行比較的列。對不起,沒有把所有的代碼,它涉及很多RM操作。簡單地說,即時搜索一種方法來用任何值替換NULL。 – user2014

+0

@ user2014見我更新 – 989

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. 如果Distance == 1提取CompareIDSimilarID向量。
  2. 如果這個SimilarID向量包含元素,則返回這些字符串CompareID","合併;否則返回"None"

然後,用這個來summarise.funcsummariseSimilarID通過ID分組。

使用您的數據:

print(df2) 
### A tibble: 2 x 2 
##  ID SimilarID 
## <int>  <chr> 
##1  1  None 
##2  2 735,108 
+0

可以只使用'ifelse',其被矢量:'DF%>%GROUP_BY(ID)%>%總結(SimilarID = ifelse(長度(CompareID [距離== 1])== 0 , '無',的toString(CompareID [距離== 1)))' – alistaire

+0

或在事後突變:'DF%>%GROUP_BY(ID)%>%總結(SimilarID =的toString(CompareID [as.logical(距離)]))%>%mutate(SimilarID = ifelse(SimilarID =='','None',SimilarID))' – alistaire

+0

@alistaire:我同意,但我只想做一次比較(儘管它是矢量化的) 。我認爲,從某種意義上說,這與Rich Scriven的(我把頭髮打到了一拳)我的答案分開了。 – aichao