【问题标题】:Converting data frame element to string in R在R中将数据框元素转换为字符串
【发布时间】:2013-06-04 00:42:08
【问题描述】:

我在df1 中有一个字母对列表。 df1 的当前维度是 1,5 :

df1= AC,AD,AE,AF,AG

我想在 df1 中添加第二行,其中包含 df1(dim: 2,5)的反转元素,即:

df1= AC,AD,AE,AF,AG
     CA,DA,EA,FA,GA

我想一次访问第一行一个元素,将每个元素转换为字符串,然后将其反转。我试过as.character(df1[1])toString(df1[1]) 但他们都给了我"1" 结果。 有人可以解释这个错误以及我该如何纠正它吗?

编辑: str[df1] 的输出是:

   'data.frame':    1 obs. of  5 variables:
     $ V1  : Factor w/ 1 level "AC": 1
     $ V2  : Factor w/ 1 level "AD": 1
     $ V3  : Factor w/ 1 level "AE": 1
     $ V4  : Factor w/ 1 level "AF": 1
     $ V5  : Factor w/ 1 level "AG": 1

【问题讨论】:

  • 你能发布str(df1)的结果是什么吗?
  • R 代码在语法上是无效。请提供实际工作的 R 代码和示例。
  • 另见strsplit,Crrl+F 并搜索strReverse

标签: regex string r type-conversion


【解决方案1】:

一般 as.matrix 是一种很好的强制方法。

df <- data.frame(matrix(c("AC","AD","AE","AF","AG"), nrow=1))
df
X1 X2 X3 X4 X5
1 AC AD AE AF AG

sapply(df, function(x) paste(rev(strsplit(as.matrix(x), "")[[1]]), collapse=""))
  X1   X2   X3   X4   X5
"CA" "DA" "EA" "FA" "GA"

它会回答吗?

【讨论】:

    【解决方案2】:

    这是使用正则表达式的一种方法:

    df1 <- read.csv(text = "AC,AD,AE,AF,AG", header = FALSE) # your data frame
    
    tmp <- sapply(df1, as.character) # a character vector
    
    matrix(c(tmp, sapply(df1, sub, pattern = "(.)(.)", replacement = "\\2\\1")), 
           2, byrow = TRUE)
    

    结果:

         [,1] [,2] [,3] [,4] [,5]
    [1,] "AC" "AD" "AE" "AF" "AG"
    [2,] "CA" "DA" "EA" "FA" "GA"
    

    结果是一个矩阵。可以用as.data.frame转换成数据框。

    【讨论】:

      【解决方案3】:

      不确定这是最简单的方法,但这是一种可行的方法 第一步是创建你的data.frame

      dat <- Reduce(data.frame,
                    c("AC", "AD", "AE", "AF", "AG"))
      names(dat) <- paste0("V", 1:ncol(dat))
      str(dat)
      
      ## 'data.frame':    1 obs. of  5 variables:
      ##  $ V1: Factor w/ 1 level "AC": 1
      ##  $ V2: Factor w/ 1 level "AD": 1
      ##  $ V3: Factor w/ 1 level "AE": 1
      ##  $ V4: Factor w/ 1 level "AF": 1
      ##  $ V5: Factor w/ 1 level "AG": 1
      

      在最后一步,我们将创建一个函数来反转字符串向量并将其应用于数据

      str_rev <- function(string)
          paste(rev(unlist(strsplit(string, ""))), collapse = "")
      
      str_rev <- Vectorize(str_rev, USE.NAMES = FALSE)
      
      
      rbind(dat,
            t(apply(dat, 1, str_rev))
            )
      
      ##   V1 V2 V3 V4 V5
      ## 1 AC AD AE AF AG
      ## 2 CA DA EA FA GA
      

      【讨论】:

        猜你喜欢
        • 2017-04-25
        • 2018-04-08
        • 2022-08-12
        • 2018-11-30
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 2019-02-21
        相关资源
        最近更新 更多