将具有许多块的字符串向量转换为具有 header 的数据框
convert a vector of string with many chunks to a data frame with a header
我有一个从 excel 文件导入的字符串向量作为单个字符串 "\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\n40\r\n\r\nDirector\r\n\r\n Maria\r\n\r\n25\r\n\r\nOfficer\r\n\r\nFemale"
我希望将此字符串转换为列名来自前四个值(姓名、职位、年龄、性别)的数据框。如果有任何缺失的单元格为 Null 或 NA。
table
Name | Position | Age | Gender
Sam | Manager | 30 | Male
Mira | Head | 25 | Female
Mario | Director | 40 | NA
Maria | Officer | 25 | Officer
我把数据拆分成一个有很多行的向量,
bb <- c("\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\n40\r\n\r\nDirector\r\n\r\n Maria\r\n\r\n25\r\n\r\nOfficer\r\n\r\nFemale")
bb_split <- bb %>% str_split(pattern ="\r\n\r\n") %>% unlist()
然后我尝试了很多方法来添加一个带有数字的列并尝试用这个数字对行进行分组,但是它变成了一个嵌套列表而没有到达我的监狱。
感谢您的支持。
我很好奇你是如何从 Excel 导入的,也许你可以使用更好的方法。
但是,在您的字符串中,在 Mario 和 Maria 之后,名称、职位、年龄、性别的顺序突然切换,我认为这是一个错误。因此我使用相应的 re-ordered 向量。
下面的代码使用了一个正则表达式,它在 "\r\n\r\n"
处以及后面没有 "Male"
或 "Female"
.
的空格处拆分
当然,您还需要根据其他变量调整此逻辑,但这可能会让您了解如何解决您的问题。
b1 <- trimws(el(strsplit(bc, "\r\n\r\n|\s(?!Male|Female)", perl=TRUE))[-1])
m <- matrix(replace(b1, b1 == "", NA), ncol=4, byrow=TRUE)
res <- setNames(as.data.frame(m[-1, ]), m[1, ])
res
# Name Position Age Gender
# 1 Sam Manager 30 Male
# 2 Mira Head 25 Female
# 3 Mario Director 40 <NA>
# 4 Maria Officer 25 Female
数据:
bc <- "\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\nDirector\r\n\r\n40\r\n\r\n Maria\r\n\r\nOfficer\r\n\r\n25\r\n\r\nFemale"
我有一个从 excel 文件导入的字符串向量作为单个字符串 "\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\n40\r\n\r\nDirector\r\n\r\n Maria\r\n\r\n25\r\n\r\nOfficer\r\n\r\nFemale"
我希望将此字符串转换为列名来自前四个值(姓名、职位、年龄、性别)的数据框。如果有任何缺失的单元格为 Null 或 NA。
table
Name | Position | Age | Gender
Sam | Manager | 30 | Male
Mira | Head | 25 | Female
Mario | Director | 40 | NA
Maria | Officer | 25 | Officer
我把数据拆分成一个有很多行的向量,
bb <- c("\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\n40\r\n\r\nDirector\r\n\r\n Maria\r\n\r\n25\r\n\r\nOfficer\r\n\r\nFemale")
bb_split <- bb %>% str_split(pattern ="\r\n\r\n") %>% unlist()
然后我尝试了很多方法来添加一个带有数字的列并尝试用这个数字对行进行分组,但是它变成了一个嵌套列表而没有到达我的监狱。
感谢您的支持。
我很好奇你是如何从 Excel 导入的,也许你可以使用更好的方法。
但是,在您的字符串中,在 Mario 和 Maria 之后,名称、职位、年龄、性别的顺序突然切换,我认为这是一个错误。因此我使用相应的 re-ordered 向量。
下面的代码使用了一个正则表达式,它在 "\r\n\r\n"
处以及后面没有 "Male"
或 "Female"
.
当然,您还需要根据其他变量调整此逻辑,但这可能会让您了解如何解决您的问题。
b1 <- trimws(el(strsplit(bc, "\r\n\r\n|\s(?!Male|Female)", perl=TRUE))[-1])
m <- matrix(replace(b1, b1 == "", NA), ncol=4, byrow=TRUE)
res <- setNames(as.data.frame(m[-1, ]), m[1, ])
res
# Name Position Age Gender
# 1 Sam Manager 30 Male
# 2 Mira Head 25 Female
# 3 Mario Director 40 <NA>
# 4 Maria Officer 25 Female
数据:
bc <- "\r\n\r\nName\r\n\r\nPosition\r\n\r\nAge\r\n\r\nGender\r\n\r\nSam\r\n\r\nManager\r\n\r\n30\r\n\r\n Male\r\n\r\nMira\r\n\r\nHead\r\n\r\n25\r\n\r\nFemale\r\n\r\nMario\r\n\r\nDirector\r\n\r\n40\r\n\r\n Maria\r\n\r\nOfficer\r\n\r\n25\r\n\r\nFemale"