web-dev-qa-db-fra.com

Comment combiner plusieurs colonnes de caractères en une seule colonne dans un bloc de données R

Je travaille avec des données de recensement et je dois combiner quatre colonnes de caractères en une seule colonne.

Exemple:

LOGRECNO STATE COUNTY  TRACT BLOCK
    60    01    001  021100  1053
    61    01    001  021100  1054
    62    01    001  021100  1055
    63    01    001  021100  1056
    64    01    001  021100  1057
    65    01    001  021100  1058

Je veux créer une nouvelle colonne qui ajoute les chaînes de STATE, COUNTY, TRACT et BLOCK ensemble en une seule chaîne. Exemple:

LOGRECNO STATE COUNTY  TRACT BLOCK  BLOCKID
    60    01    001  021100  1053   01001021101053
    61    01    001  021100  1054   01001021101054
    62    01    001  021100  1055   01001021101055
    63    01    001  021100  1056   01001021101056
    64    01    001  021100  1057   01001021101057
    65    01    001  021100  1058   01001021101058

J'ai essayé:

AL_Blocks$BLOCK_ID<- paste(c(AL_Blocks$STATE, AL_Blocks$County, AL_Blocks$TRACT,    AL_Blocks$BLOCK), collapse = "")

Mais cela combine toutes les lignes des quatre colonnes en une seule chaîne.

14
SamanthaDS

Essaye ça:

AL_Blocks$BLOCK_ID<- with(AL_Blocks, paste0(STATE, COUNTY, TRACT, BLOCK))

il y avait une faute de frappe dans le comté ... ça aurait dû être COMTÉ. De plus, vous n'avez pas besoin du paramètre de réduction.

J'espère que ça aide.

10
JAponte

Vous pouvez utiliser do.call et paste0. Essayer:

AL_Blocks$BLOCK_ID <- do.call(paste0, AL_Block[c("STATE", "COUNTY", "TRACT", "BLOCK")])

Exemple de sortie:

do.call(paste0, AL_Blocks[c("STATE", "COUNTY", "TRACT", "BLOCK")])
# [1] "010010211001053" "010010211001054" "010010211001055" "010010211001056"
# [5] "010010211001057" "010010211001058"
do.call(paste0, AL_Blocks[2:5])
# [1] "010010211001053" "010010211001054" "010010211001055" "010010211001056"
# [5] "010010211001057" "010010211001058"

Vous pouvez également utiliser unite de "tidyr", comme ceci:

library(tidyr)
library(dplyr)
AL_Blocks %>% 
  unite(BLOCK_ID, STATE, COUNTY, TRACT, BLOCK, sep = "", remove = FALSE)
#   LOGRECNO        BLOCK_ID STATE COUNTY  TRACT BLOCK
# 1       60 010010211001053    01    001 021100  1053
# 2       61 010010211001054    01    001 021100  1054
# 3       62 010010211001055    01    001 021100  1055
# 4       63 010010211001056    01    001 021100  1056
# 5       64 010010211001057    01    001 021100  1057
# 6       65 010010211001058    01    001 021100  1058

où "AL_Blocks" est fourni comme:

AL_Blocks <- structure(list(LOGRECNO = c("60", "61", "62", "63", "64", "65"), 
    STATE = c("01", "01", "01", "01", "01", "01"), COUNTY = c("001", "001", 
    "001", "001", "001", "001"), TRACT = c("021100", "021100", "021100", 
    "021100", "021100", "021100"), BLOCK = c("1053", "1054", "1055", "1056",
    "1057", "1058")), .Names = c("LOGRECNO", "STATE", "COUNTY", "TRACT", 
    "BLOCK"), class = "data.frame", row.names = c(NA, -6L))
13

Vous pouvez aussi essayer ça

AL_Blocks <- transform(All_Blocks, BLOCKID = paste(STATE,COUNTY,
                       TRACT, BLOCK, sep = "")
4
Kou

Ou essayez ceci

DF$BLOCKID <-
  paste(DF$LOGRECNO, DF$STATE, DF$COUNTY, 
        DF$TRACT, DF$BLOCK, sep = "")

(Voici une méthode pour configurer la trame de données pour les personnes qui entrent dans cette discussion plus tard)

DF <- 
  data.frame(LOGRECNO = c(60, 61, 62, 63, 64, 65),
             STATE = c(1, 1, 1, 1, 1, 1),
             COUNTY = c(1, 1, 1, 1, 1, 1), 
             TRACT = c(21100, 21100, 21100, 21100, 21100, 21100), 
             BLOCK = c(1053, 1054, 1055, 1056, 1057, 1058))
3
Freda K

Vous pouvez utiliser le package tidyverse:

DF %>% unite(new_var, STATE, COUNTY, TRACT, BLOCK)
2
Sophia J

Vous pouvez à la fois ÉCRIRE et LIRE Fichiers texte avec n'importe quel "séparateur de chaînes" spécifié , pas nécessairement un séparateur de caractères. Ceci est très utile dans de nombreux cas lorsque les données contiennent pratiquement tous les symboles de terminal, et donc, aucun symbole 1 ne peut être utilisé comme séparateur. Voici des exemples de fonctions de lecture et d'écriture :

ECRIRE le texte du séparateur spécial:

writeSepText <- function(df, fileName, separator) {
    con <- file(fileName)
    data <- apply(df, 1, paste, collapse = separator)
    # data
    data <- writeLines(data, con)
    close(con)
    return
}

Test Écriture d'un fichier texte séparé par une chaîne "bra_break_ket"

writeSepText(df=as.data.frame(Titanic), fileName="/Users/user/break_sep.txt", separator="<break>")

LIRE Dans des fichiers texte avec une chaîne de séparation spéciale

readSepText <- function(fileName, separator) {
    data <- readLines(con <- file(fileName))
    close(con)
    records <- sapply(data, strsplit, split=separator)
    dataFrame <- data.frame(t(sapply(records,c)))
    rownames(dataFrame) <- 1: nrow(dataFrame)
    return(as.data.frame(dataFrame,stringsAsFactors = FALSE))
}

Test de lecture dans un fichier texte séparé par

df <- readSepText(fileName="/Users/user/break_sep.txt", separator="<break>"); df
0
user11300405