2017-01-17 3 views
3

У меня есть столбец, содержащий 1200 символов. В каждом из них каждая группа из четырех символов является шестнадцатеричной для числа. т. е. 300 чисел в шестнадцатеричном виде, переполненных в строку из 1200 символов, в каждой строке. Мне нужно, чтобы каждый номер был десятичным, и в его собственный столбец (300 новых столбцов) с именем 1-300. Вот что я понял, до сих пор:Создание новых столбцов из длинных строк, разбитых на 300 подстрок?

Data.frame: 
         BigString 
       [1] 0043003E803C0041004A...(etc...) 

Вот что я сделал до сих пор:

decimal.fours <- function(x) { 
    strtoi(substring(BigString[x], seq(1,1197,4), seq(4,1197,4)), 16L) 
} 
decimal.fours(1) 
[1] 283 291 239 177 ... 

Но теперь я застрял. Как я могу вывести этот индивидуальный номер (и остальные 296 в новые столбцы?) У меня есть пятьдесят полных строк/строк. Было бы здорово сделать их все сразу, т. Е. 300 новых столбцов, содержащих разбитые подстроки из 50 строк.

ответ

1

Обязательный tidyverse пример:

library(tidyverse) 

установки некоторые данные

set.seed(1492) 

bet <- c(0:9, LETTERS[1:6]) # alphabet for hex digit sequences 
i <- 8      # number of rows 
n <- 10      # number of 4-hex-digit sequences 

df <- data_frame(
    some_other_col=LETTERS[1:i], 
    big_str=map_chr(1:i, ~sample(bet, 4*n, replace=TRUE) %>% paste0(collapse="")) 
) 

df 
## # A tibble: 8 × 2 
## some_other_col         big_str 
##   <chr>         <chr> 
## 1    A0D86CAA388C15AEA6291E985F2FD3FB6104 
## 2    B BC2673D112925EBBB3FD175837AF7176C39B4888 
## 3    C B4E99FDAABA47515EADA786715E811EE0502ABE8 
## 4    D 64E622D7037D35DE6ADC40D0380E1DC12D753CBC 
## 5    E CF7CDD7BBC610443A8D8FCFD896CA9730673B181 
## 6    F ED86AEE8A7B65F843200B823CFBD17E9F3CA4EEF 
## 7    G 2B9BCB73941228C501F937DA8E6EF033B5DD31F6 
## 8    H 40823BBBFDF9B14839B7A95B6E317EBA9B016ED5 

ли манипуляции

read_fwf(paste0(df$big_str, collapse="\n"), 
     fwf_widths(rep(4, n)), 
     col_types=paste0(rep("c", n), collapse="")) %>% 
    mutate_all(strtoi, base=16) %>% 
    bind_cols(df) %>% 
    select(some_other_col, everything(), -big_str) 
## # A tibble: 8 × 11 
## some_other_col X1 X2 X3 X4 X5 X6 X7 X8 X9 
##   <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> 
## 1    A 17185 216 27818 14476 5550 42537 7832 24367 54267 
## 2    B 48166 29649 4754 24251 46077 5976 14255 29046 50075 
## 3    C 46313 40922 43940 29973 60122 30823 5608 4590 1282 
## 4    D 25830 8919 893 13790 27356 16592 14350 7617 11637 
## 5    E 53116 56699 48225 1091 43224 64765 35180 43379 1651 
## 6    F 60806 44776 42934 24452 12800 47139 53181 6121 62410 
## 7    G 11163 52083 37906 10437 505 14298 36462 61491 46557 
## 8    H 16514 15291 65017 45384 14775 43355 28209 32442 39681 
## # ... with 1 more variables: X10 <int> 
+0

Мне любопытно - зачем смешивать вложенные функции и трубы? Если вы используете трубку, почему бы и нет: 'df $ big_str%>% paste0 (collapse =" \ n ")%>% read_fwf (...'? – arvi1000

+0

Идите, если это сработает лучше для вас. представляя https://github.com/hrbrmstr/rstudioconf2017 в rstudio :: conf (2017L) и не верю, что я нарушил какие-либо мои личные «рекомендации» для трубопроводов здесь. – hrbrmstr

1

вы можете использовать read.fwf гласивший в файлах с фиксированной шириной для каждого столбца:

# an example vector of big strings 
BigString = c("0043003E803C0041004A", "0043003E803C0041004A", "0043003E803C0041004A") 

n = 5     # n is the number of columns for your result(300 for your real case) 
as.data.frame(
     lapply(read.fwf(file = textConnection(BigString), 
         widths = rep(4, n), 
         colClasses = "character"), 
      strtoi, base = 16)) 

# V1 V2 V3 V4 V5 
#1 67 62 32828 65 74 
#2 67 62 32828 65 74 
#3 67 62 32828 65 74 

Если вы хотите сохранить функцию decimal.hours, вы можете изменить его следующим образом и вызвать lapply к конвертируйте ваши bigStrings в список целых чисел, которые могут быть дополнительно преобразованы в data.frame с do.call(rbind, ...) картина:

decimal.fours <- function(x) { 
    strtoi(substring(x, seq(1,1197,4), seq(4,1197,4)), 16L) 
} 

do.call(rbind, lapply(BigString, decimal.fours)) 
1

просто попробовать, используя базовый-R

BigString = c("0043003E803C0041004A", "0043003E803C0041004A", "0043003E803C0041004A") 
df = data.frame(BigString) 


t(sapply(df$BigString, function(x) strtoi(substring(x, seq(1, 297, 4)[1:5], 
                seq(4, 300, 4)[1:5]), base = 16))) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 67 62 32828 65 74 
#[2,] 67 62 32828 65 74 
#[3,] 67 62 32828 65 74 

# you can set the columns together at the end using `paste0("new_col", 1:300)` 
# [1:5] was just used for this example, because i had strings of length 20cahr 
+0

@oetaylor mind Принимая один из ответов как точную? http://stackoverflow.com/help/someone-answers –

Смежные вопросы