如何在R中将字符串拆分为字符标签和数值?

nwsw7zdq  于 2023-06-03  发布在  其他
关注(0)|答案(5)|浏览(214)

奋斗的新手在这里,请原谅不优雅的解释,让我知道我需要澄清。
我有一个像这样的对象,一个字符串向量:
“aaaa,1,1,1,1,0”
abba,0,0,1,1
“bbaa,1,0,0,0,1”
我想把四个字母的标签拆分成一个字符向量,剩下的部分我想重构成数字,这样我就得到了一个像这样的 Dataframe ,3个obs,6个变量,标签是字符,数字是数字:
aaaa 1 1 1 0
阿爸0 0 1 1
bbaa 1 0 0 1
然后我想给它加上“列标签”,最后得到
电话:021 - 88888888
aaaa 1 1 1 0
阿爸0 0 1 1
bbaa 1 0 0 1
我还想要一匹小马
我觉得我有零碎的东西……我可以分裂出四个字母标签使用
substr(data,1,4)这样就得到了一个向量
“aaaa”“abba”“bbaa”
但是我不知道该用什么来得到字符串的其余部分,数字部分,作为一个向量。substr(data,5,last)不起作用,我不喜欢说substr(data,5,14),因为尽管我在这里举了个例子,但字符串并不总是14个字符长。是否有方法指定substr(data,5,"to the end of the string?")
然后,为了将字符串转换为数字,我尝试
as.integer(unlist(strsplit(data,",")))
在原始文件上,我得到了一个带有1和0的长向量,但其中的标签,“aaba”被替换为NA。
我被困在试图把所有的碎片拼在一起。
[Why你可能会问,我的数字和标签是不是一开始就混在一个字符串里了?因为我想用“1,1,1”替换所有“1,0,1”的示例,并使用paste()将数字转换为字符串,并在字符串上使用gsub()来实现替换,这是我唯一能做到的。

elcex8rz

elcex8rz1#

你走上了正确的道路。我不得不添加更多的步骤,但我得到了以下工作:

input = c(
    "aaaa,1,1,1,1,0",
    "abba,0,0,1,1,1",
    "bbaa,1,0,0,0,1"
)

df = type.convert(
    as.data.frame(
        matrix(unlist(strsplit(input, ',')), byrow = TRUE, nrow = length(input))),
    as.is = TRUE
)
ulmd4ohb

ulmd4ohb2#

两种选择:
1.在base R中,运行substr(data, 5, length(data))
1.如果您愿意使用其他软件包,请尝试stringr。然后,您可以使用-1来指示向量的结束。试试stringr::str_sub(data, 5, -1)

mftmpeh8

mftmpeh83#

我认为BigFinger的答案执行了几乎所有期望的功能,但为了更改列名,您可以添加names(df) <- c("NAME",1,2,3,4,5)

gmxoilav

gmxoilav4#

以下是tidyverse解决方案:

library(tibble)
library(dplyr)
library(tidyr)

tibble(input) %>% 
  separate(input, into=LETTERS[1:6], sep = ",", convert = TRUE)
A         B     C     D     E     F
  <chr> <int> <int> <int> <int> <int>
1 aaaa      1     1     1     1     0
2 abba      0     0     1     1     1
3 bbaa      1     0     0     0     1
mum43rcc

mum43rcc5#

您的向量形成一个逗号分隔的文件,因此只需使用read.csv
您可以将名称添加为第一个字符串并使用header=TRUE12等不是很好的列名,R会尝试修复它们,但如果你确定你想要它们,使用check.names=FALSE来保持它们的原样。

> read.csv(text=c("NAME,1,2,3,4,5",x), header=TRUE,check.names = FALSE)

  NAME 1 2 3 4 5
1 aaaa 1 1 1 1 0
2 abba 0 0 1 1 1
3 bbaa 1 0 0 0 1

相关问题