2017-11-11 2 views
2
library(data.table) 
library(lubridate) 

x1 <- c(20090101, "2009-01-02", "2009 01 03", "2009-1-4", 
     "2009-1, 5", "Created on 2009 1 6", "200901 !!! 07") 

dt2 <- data.table(id = c(1,1,1,2,2,2,2), date1 = ymd(x1), charval = c("aa","vv","ss","a","b","c","d")) 

    id  date1 charval 
1: 1 2009-01-01  aa 
2: 1 2009-01-02  vv 
3: 1 2009-01-03  ss 
4: 2 2009-01-04  a 
5: 2 2009-01-05  b 
6: 2 2009-01-06  c 
7: 2 2009-01-07  d 

나는 ID로 그룹화하는 다음 코드를 사용 그러나 실제로 나는 다음 결과를 봅니다 :R 붕괴 여러 행이

id date1 charval 
1: 1 NA  aa 
2: 2 NA  a 

1) 이해 해달라고 이유를 붙여 나던 작업 2)은 평균 (DATE1) 나던 작업 예를 들어 다음 코드는 잘 작동하기 때문에 이유를 이해 해달라고 : 우리가 Map을 통과해야하는 이유

mean(dt2$date1) 
[1] "2009-01-04" 

답변

1

그것은 분명하지 않다 및 get. 영업 이익의 질문에 대한 Map이기 때문에 toStringpaste(..., collapse=', ')

dt2[, .(date1 = mean(date1), charval = paste(charval, collapse=";")), id] 
# id  date1 charval 
#1: 1 2009-01-02 aa;vv;ss 
#2: 2 2009-01-05 a;b;c;d 

입니다 : 'ID'로 그룹화 한 후,

dt2[, .(date1 = mean(date1), charval = toString(charval)), id] 
# id  date1 charval 
#1: 1 2009-01-02 aa, vv, ss 
#2: 2 2009-01-05 a, b, c, d 

참고 함께 '날짜 1'과 paste 'charval'의 mean를 얻을 수 get을 사용하여 mean으로 전화하십시오. 이 트리거 될 것 같습니다

경우 (! is.numeric (x)의 & &! is.complex (x)는 & &! is.logical (X)) { 경고 ("인수가 숫자가 아니거나 논리적 :) " 리턴 (NA_real_)

를 NA를 ​​반환하고이 numeric로 저장되어 있지만 '날짜 1은'클래스 Date의 것을 발견 할 때 NA를 반환합니다. 한 가지 옵션은 get에 을 지정하는 것입니다.

또 다른 문제는 ifelse을 사용하는 것입니다. 이 두 요소

dt2[, Map(function(x, y) if(x != "paste") get(x, envir = parent.frame())(y, na.rm = TRUE) 
    else paste(y, collapse=':'), setNames(c("mean", "paste"), names(.SD)), .SD), by = id] 
# id  date1 charval 
#1: 1 2009-01-02 aa:vv:ss 
#2: 2 2009-01-05 a:b:c:d 

get 종류의 까다 롭습니다하고 올바른 환경을 지정하면

get("mean")(dt2$date1) 
#[1] "2009-01-04" 

또는 대신 if/else에 예상대로 작동으로는 if/else를 사용하는 것이 좋습니다 "붙여 넣기"문자열을 확인하려면 열 class을 확인하고 character 인 경우 paste을 입력하거나 mean

를 반환하십시오.
dt2[, Map(function(x, y) if(is.character(y)) get(x)(y, collapse=":") 
    else get(x, envir = parent.frame())(y, na.rm = TRUE), 
    setNames(c("mean", "paste"), names(.SD)), .SD), by = id] 
# id  date1 charval 
#1: 1 2009-01-02 aa:vv:ss 
#2: 2 2009-01-05 a:b:c:d 

번거 로움없이 첫 번째 방법을 사용하는 것이 더 좋습니다.