如何在R数据框中将多个字符列合并为单个列

30

我正在处理人口普查数据,需要将四个字符列合并成一个单独的列。

例如:

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

我想创建一个新列,将STATE、COUNTY、TRACT和BLOCK的字符串合并为一个字符串。例如:

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

我尝试过:

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

但这将所有四列的所有行组合成单个字符串。

7个回答

26

试一试:

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

在“County”一词中存在一个拼写错误,应该是“COUNTY”。另外,您不需要使用collapse参数。

希望这可以帮助到您。


22

您可以使用do.callpaste0函数。请尝试:

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

示例输出:

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"
你也可以使用来自 "tidyr" 的 unite 函数,像这样:
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

其中,“AL_Blocks”如下所示:

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))

6
你也可以尝试这个。
AL_Blocks <- transform(All_Blocks, BLOCKID = paste(STATE,COUNTY,
                       TRACT, BLOCK, sep = "")

5
或者你可以尝试这个。
DF$BLOCKID <-
  paste(DF$LOGRECNO, DF$STATE, DF$COUNTY, 
        DF$TRACT, DF$BLOCK, sep = "")

这里有一种方法可以为以后加入讨论的人设置数据框架。
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))

1
我有80列,是否有一种方法可以像A[,2:82]这样传递列名,因为那会让我的生活变得更轻松? - kRazzy R
1
@kRazzyR,这个解决方案适用于我的54列。数据(鸢尾花) iris$full <- apply(iris[,1:5], 1,paste, collapse="~")对于你的例子,可以这样写:apply(A[, 2:82], 1, paste, collapse = " ")。你可以在collapse参数中指定分隔符。 - Yimihua

4
您可以使用 tidyverse 软件包:
DF %>% unite(new_var, STATE, COUNTY, TRACT, BLOCK)

2

新出现的一款工具是 glue 包:

library(glue)

my_data %>%

    glue::glue("{STATE}{COUNTY}{TRACT}{BLOCK}")

0

您可以使用任何指定的“字符串分隔符”来编写读取文本文件,而不一定是字符分隔符。这在许多情况下非常有用,特别是当数据几乎具有所有终端符号时,因此没有一个符号可以用作分隔符。以下是读取编写函数的示例:

编写特殊分隔符文本:

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

测试编写文本文件,以字符串“bra_break_ket”分隔

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

使用特殊分隔字符串读取文本文件

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))
}

分隔符读取文本文件进行测试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接