通过拆分每个单元格中的信息来创建新数据框

Create a new dataframe by spliting info in each cell

我有一个如下所示的数据框:

idx obj1  obj2   obj3
1   2Home NA     3Space
2   NA    NA     NA
3   NA    3Space 2Home

我想创建两个新的数据框:1) 其中列只是前面的整数,另一个只是单词。列名将保持不变。

编辑: 此信息来自我得到的 csv

df = read.csv("./Documents/BC-Docs/rating-per-user.csv", na.strings=c("","NA"))

我们可以通过循环 across 在字符列上使用 parse_number 来创建第一个数据集

library(dplyr)
out1 <- df1 %>% 
     mutate(across(where(is.character), ~ readr::parse_number(.)))
out1
  idx obj1 obj2 obj3
1   1    2   NA    3
2   2   NA   NA   NA
3   3   NA    3    2

类似地,str_remove从每列中删除所有数字以创建第二个数据

library(stringr)
out2 <- df1 %>% 
    mutate(across(where(is.character), ~ str_remove(., "\d+")))
out2
  idx obj1  obj2  obj3
1   1 Home  <NA> Space
2   2 <NA>  <NA>  <NA>
3   3 <NA> Space  Home

数据

df1 <- structure(list(idx = 1:3, obj1 = c("2Home", NA, NA), obj2 = c(NA, 
NA, "3Space"), obj3 = c("3Space", NA, "2Home")), 
class = "data.frame", row.names = c(NA, 
-3L))

我们可以用 purrr:mapstringr::str_remove 以及 dplyr::mutate

这两个数据框创建一个列表
library(dplyr)
library(stringr)
library(purrr)

map(c(character='^\d', numeric='[^\d].*'),
    function(x) df1%>%mutate(across(contains('obj'), ~str_remove(.x, x))))

$character
  idx obj1  obj2  obj3
1   1 Home  <NA> Space
2   2 <NA>  <NA>  <NA>
3   3 <NA> Space  Home

$numeric
  idx obj1 obj2 obj3
1   1    2 <NA>    3
2   2 <NA> <NA> <NA>
3   3 <NA>    3    2

这是使用 lapply -

的基础 R 选项
cols <- grep('obj', names(df))
#Create copies of original dataframe
df1 <- df
df2 <- df
#Keep only numbers
df1[cols] <- lapply(df[cols], function(x) as.numeric(gsub('\D', '', x)))
df1

#  idx obj1 obj2 obj3
#1   1    2   NA    3
#2   2   NA   NA   NA
#3   3   NA    3    2

#Keep only characters
df2[cols] <- lapply(df[cols], function(x) gsub('\d', '', x))
df2

#  idx obj1  obj2  obj3
#1   1 Home  <NA> Space
#2   2 <NA>  <NA>  <NA>
#3   3 <NA> Space  Home