通过拆分每个单元格中的信息来创建新数据框
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:map
和 stringr::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
我有一个如下所示的数据框:
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:map
和 stringr::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
-
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