2017-09-18 1 views
0

으로 변경했습니다. 비교적 독특한 문제라고 생각하기 때문에이 질문의 비슷한 버전을 찾을 수 없을 것 같지만, 내가 잘못하면 올바른 방향으로. 나는 내가 dataframe로 변환해야 할 다음과 같은 벡터 함께 일하고 :벡터를 2-column 데이터 프레임으로 변환하여 문자열 배열을 R

myvec = structure(c(1.03, 2.3, -1.2, -0.09, -0.31, -0.51, 3.4, 3, 0.07, 
0.02, 1.05, -0.02, 2.03), .Names = c("Intercept", "DEF-1017", 
"DEF-1025", "DEF-103", "DEF-1043", "DEF-1046", "DEF-1048", "DEF-1076", 
"OFF-1017", "OFF-1025", "OFF-103", "OFF-1046", "OFF-1076")) 

head(myvec) 
Intercept DEF-1017 DEF-1025 DEF-103 DEF-1043 DEF-1046 
1.03  2.30  -1.20  -0.09  -0.31  -0.51 

이 벡터는 7 개의 다른 사용자 (사용자 1017, 1025, (103)에 대한 공격 (OFF)과 방어 (DEF) 계수를 가질 예정이다, 1043, 1046, 1048, 1076), 2 명의 사용자에 대해 불쾌감을주는 계수가 없습니다. 이것을 4 열 (방어 ID, 공격 ID, 방어 계수, 공격 계수)이있는 데이터 프레임으로 변환해야합니다. 구체적으로는, 나는 누락 된 값이 방식으로 회계, 다음 dataframe을 좀하고 싶습니다 : 절편 값이 삭제됩니다

mydf = structure(list(DEFID = c("DEF-1017", "DEF-1025", "DEF-103", "DEF-1043", 
"DEF-1046", "DEF-1048", "DEF-1076"), OFFID = c("OFF-1017", "OFF-1025", 
"OFF-103", NA, "OFF-1046", NA, "OFF-1076"), DEFVAL = c(2.3, -1.2, 
-0.09, -0.31, -0.51, 3.4, 3), OFFVAL = c(0.07, 0.02, 1.05, NA, 
-0.02, NA, 2.03)), .Names = c("DEFID", "OFFID", "DEFVAL", "OFFVAL" 
), row.names = c(NA, -7L), class = "data.frame") 

mydf 
    DEFID OFFID DEFVAL OFFVAL 
1 DEF-1017 OFF-1017 2.30 0.07 
2 DEF-1025 OFF-1025 -1.20 0.02 
3 DEF-103 OFF-103 -0.09 1.05 
4 DEF-1043  <NA> -0.31  NA 
5 DEF-1046 OFF-1046 -0.51 -0.02 
6 DEF-1048  <NA> 3.40  NA 
7 DEF-1076 OFF-1076 3.00 2.03 

/테이블에 포함되지 않으며, 모든 것이 다른 사람으로 포맷됩니다 기대된다. 어떤 도움을 주셔서 감사합니다, 감사합니다!

답변

0

나는 다음과 같은 작업을 위해 tidyr 패키지를 사용

dataframe 형식으로

첫번째 Conver 유럽 : 절편 밖으로

library(tidyverse) 
df <- data_frame(names= names(myvec), 
      values=myvec) 

다음 필터, 그리고 tidyr 명령을 재 배열 :

df %>% filter(names !="Intercept") %>% 
    extract(names, into=c("coeff", "user"), "([[:alnum:]]+)-([[:alnum:]]+)") %>% 
    spread(coeff, values) 
# A tibble: 7 x 3 
    user DEF OFF 
* <chr> <dbl> <dbl> 
1 1017 2.30 0.07 
2 1025 -1.20 0.02 
3 103 -0.09 1.05 
4 1043 -0.31 NA 
5 1046 -0.51 -0.02 
6 1048 3.40 NA 
7 1076 3.00 2.03 

이름 등이 위에 열거 한 것과 정확히 일치하도록하려면 조금 더 처리하십시오 :

df %>% filter(names !="Intercept") %>% 
    extract(names, into=c("coeff", "user"), "([[:alnum:]]+)-([[:alnum:]]+)") %>% 
    spread(coeff, values) %>% 
    mutate(DEFID = paste("DEF", user, sep="-"), 
     OFFID = paste("OFF", user, sep="-")) %>% 
    rename(DEFVAL=DEF, 
     OFFVAL=OFF) %>% 
    select(DEFID, OFFID, DEFVAL, OFFVAL) 
# A tibble: 7 x 4 
    DEFID OFFID DEFVAL OFFVAL 
    <chr> <chr> <dbl> <dbl> 
1 DEF-1017 OFF-1017 2.30 0.07 
2 DEF-1025 OFF-1025 -1.20 0.02 
3 DEF-103 OFF-103 -0.09 1.05 
4 DEF-1043 OFF-1043 -0.31  NA 
5 DEF-1046 OFF-1046 -0.51 -0.02 
6 DEF-1048 OFF-1048 3.40  NA 
7 DEF-1076 OFF-1076 3.00 2.03 
0

여기 정확히 원하는대로 있습니다. split, substrmerge을 사용했습니다. 그리고 이것은 이것이 원하는 출력을 제공하는 가장 짧은 방법이라고 생각합니다.

library(dplyr) 
DF <- tibble::rownames_to_column(data.frame(myvec)) 
DF <- DF[DF$rowname!= "Intercept",] 
dff <- split(DF , f = substr(DF$rowname, 1, 3)) 
dff2 <- dff[[1]]; dff3 <- dff[[2]] 
dff2$ID <- substr(dff2$rowname, 5, nchar(dff2$rowname)) 
dff3$ID <- substr(dff3$rowname, 5, nchar(dff3$rowname)) 
DF2 <- merge(dff2,dff3,by="ID", all = TRUE) 
DF2 <- DF2[,c(2,4,3,5)] 
names(DF2) <- c("DEFID", "OFFID", "DEFVAL", "OFFVAL") 

DF2 

    DEFID  OFFID DEFVAL OFFVAL 
1 DEF-1017 OFF-1017 2.30 0.07 
2 DEF-1025 OFF-1025 -1.20 0.02 
3 DEF-103 OFF-103 -0.09 1.05 
4 DEF-1043  <NA> -0.31  NA 
5 DEF-1046 OFF-1046 -0.51 -0.02 
6 DEF-1048  <NA> 3.40  NA 
7 DEF-1076 OFF-1076 3.00 2.03 
관련 문제