如何在 R 中将一个分组变量分成两个具有字符串值的变量?
How to Divide a Grouping Variable into Two Variables with String Values in R?
我有一个如下所示的数据:
Exp1 <- structure(list(Duration = c(159L, 170L, 140L, 95L, 216L, 142L
), Group = c("Personal Failure", "Personal Failure", "Nonpersonal Failure",
"Nonpersonal Success", "Personal Success", "Nonpersonal Failure"
)), row.names = c(NA, 6L), class = "data.frame")
我想将“组”列分成两个不同的列,以便每个值的第一个词 (Personal/Nonpersonal) 组成一个名为“类型”的列,第二个词 (Failure/Success) 构成另一个名为“成就”的栏目。
我该怎么做?
这是我想要获得的示例输出:
Exp1 <- structure(list(Duration = c(159L, 170L, 140L, 95L, 216L, 142L
), type = c("Personal ", "Personal ", "Nonpersonal ", "Nonpersonal ",
"Personal ", "Nonpersonal "), achivement = c("Failure", "Failure",
"Failure", "Success", "Success", "Failure")), row.names = c(NA,
6L), class = "data.frame")
你可以试试
library(dplyr)
Exp1 %>%
rowwise %>%
mutate(Type = (strsplit(Group, " ") %>% unlist)[1],
Achievement = (strsplit(Group, " ") %>% unlist)[2])
Duration Group Type Achievement
<int> <chr> <chr> <chr>
1 159 Personal Failure Personal Failure
2 170 Personal Failure Personal Failure
3 140 Nonpersonal Failure Nonpersonal Failure
4 95 Nonpersonal Success Nonpersonal Success
5 216 Personal Success Personal Success
6 142 Nonpersonal Failure Nonpersonal Failure
library(tidyr)
library(dplyr)
Exp1 %>%
separate(col = Group,into = c("Type","Achievement"),remove = FALSE)
Duration Group Type Achievement
1 159 Personal Failure Personal Failure
2 170 Personal Failure Personal Failure
3 140 Nonpersonal Failure Nonpersonal Failure
4 95 Nonpersonal Success Nonpersonal Success
5 216 Personal Success Personal Success
6 142 Nonpersonal Failure Nonpersonal Failure
基础 R 解决方案:
split_vec_name <- "Group"
cbind(
Exp1[,names(Exp1) != split_vec_name, drop = FALSE],
strcapture(
pattern = "(\w+)\s+(\w+)",
x = Exp1[,split_vec_name],
proto = list(type = character(), achievement = character())
)
)
我有一个如下所示的数据:
Exp1 <- structure(list(Duration = c(159L, 170L, 140L, 95L, 216L, 142L
), Group = c("Personal Failure", "Personal Failure", "Nonpersonal Failure",
"Nonpersonal Success", "Personal Success", "Nonpersonal Failure"
)), row.names = c(NA, 6L), class = "data.frame")
我想将“组”列分成两个不同的列,以便每个值的第一个词 (Personal/Nonpersonal) 组成一个名为“类型”的列,第二个词 (Failure/Success) 构成另一个名为“成就”的栏目。
我该怎么做?
这是我想要获得的示例输出:
Exp1 <- structure(list(Duration = c(159L, 170L, 140L, 95L, 216L, 142L
), type = c("Personal ", "Personal ", "Nonpersonal ", "Nonpersonal ",
"Personal ", "Nonpersonal "), achivement = c("Failure", "Failure",
"Failure", "Success", "Success", "Failure")), row.names = c(NA,
6L), class = "data.frame")
你可以试试
library(dplyr)
Exp1 %>%
rowwise %>%
mutate(Type = (strsplit(Group, " ") %>% unlist)[1],
Achievement = (strsplit(Group, " ") %>% unlist)[2])
Duration Group Type Achievement
<int> <chr> <chr> <chr>
1 159 Personal Failure Personal Failure
2 170 Personal Failure Personal Failure
3 140 Nonpersonal Failure Nonpersonal Failure
4 95 Nonpersonal Success Nonpersonal Success
5 216 Personal Success Personal Success
6 142 Nonpersonal Failure Nonpersonal Failure
library(tidyr)
library(dplyr)
Exp1 %>%
separate(col = Group,into = c("Type","Achievement"),remove = FALSE)
Duration Group Type Achievement
1 159 Personal Failure Personal Failure
2 170 Personal Failure Personal Failure
3 140 Nonpersonal Failure Nonpersonal Failure
4 95 Nonpersonal Success Nonpersonal Success
5 216 Personal Success Personal Success
6 142 Nonpersonal Failure Nonpersonal Failure
基础 R 解决方案:
split_vec_name <- "Group"
cbind(
Exp1[,names(Exp1) != split_vec_name, drop = FALSE],
strcapture(
pattern = "(\w+)\s+(\w+)",
x = Exp1[,split_vec_name],
proto = list(type = character(), achievement = character())
)
)