dplyr&tible-根据列表列中的值创建新列
我有一个TIBLE数据帧,如下所示:dplyr&tible-根据列表列中的值创建新列,r,dplyr,tibble,R,Dplyr,Tibble,我有一个TIBLE数据帧,如下所示: data = tibble(X = c("a", "b", "c", "d","c"), Y = c("a1", "b1", "c1", "d1","c1"), Z = c("a2", "b2", "c2", "d2","c2"), all = list(c("a"), c("b"), c("c", "c1"), c("d", "d2"), c("c", "b2"))) 我想创建一个新的列结果
data = tibble(X = c("a", "b", "c", "d","c"),
Y = c("a1", "b1", "c1", "d1","c1"),
Z = c("a2", "b2", "c2", "d2","c2"),
all = list(c("a"), c("b"), c("c", "c1"), c("d", "d2"), c("c", "b2")))
我想创建一个新的列结果,以便每行:
-如果Y值为all=>结果等于Y值
-如果Z值为all=>结果等于Z值
-否则结果等于零
我用dplyr语法尝试了以下代码
data %>%
mutate(result = case_when(Y %in% all ~ Y,
Z %in% all ~ Z,
TRUE ~ "none"))
它无法按预期工作,并返回:
# A tibble: 4 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [2]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> none
4 d d1 d2 <chr [2]> none
当我想获得:
# A tibble: 4 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [2]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
编辑
一个问题是取消列列表中的值,如所述。但是即使有了这个解决方案,行为就像在列列表上工作,也会考虑列的所有值,而不仅仅是行的值。p>
以下是我通过建议的解决方案和编辑的数据获得的信息:
data %>%
mutate(result = case_when(Y %in% flatten_chr(all) ~ Y,
Z %in% flatten_chr(all) ~ Z,
TRUE ~ "none"))
# A tibble: 5 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [1]> none
2 b b1 b2 <chr [1]> b2
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
5 c c1 c2 <chr [2]> c1
应在何时返回:
# A tibble: 5 x 5
X Y Z all result
<chr> <chr> <chr> <list> <chr>
1 a a1 a2 <chr [1]> none
2 b b1 b2 <chr [1]> none
3 c c1 c2 <chr [2]> c1
4 d d1 d2 <chr [2]> d2
5 c c1 c2 <chr [2]> none
所有列实际上是一个列表,不能直接比较列表列中的值
比如说,
"a" %in% list(c("a", "b"))
#[1] FALSE
您需要取消列表或将其展平才能使其正常工作
"a" %in% unlist(list(c("a", "b")))
#[1] TRUE
"a" %in% flatten_chr(list(c("a", "b")))
#[1] TRUE
那么,现在你可以做了
library(tidyverse)
data %>%
mutate(result = case_when(Y %in% flatten_chr(all) ~ Y,
Z %in% flatten_chr(all) ~ Z,
TRUE ~ "none"))
# X Y Z all result
# <chr> <chr> <chr> <list> <chr>
#1 a a1 a2 <chr [2]> none
#2 b b1 b2 <chr [1]> none
#3 c c1 c2 <chr [2]> c1
#4 d d1 d2 <chr [2]> d2
所有列实际上是一个列表,不能直接比较列表列中的值
比如说,
"a" %in% list(c("a", "b"))
#[1] FALSE
您需要取消列表或将其展平才能使其正常工作
"a" %in% unlist(list(c("a", "b")))
#[1] TRUE
"a" %in% flatten_chr(list(c("a", "b")))
#[1] TRUE
那么,现在你可以做了
library(tidyverse)
data %>%
mutate(result = case_when(Y %in% flatten_chr(all) ~ Y,
Z %in% flatten_chr(all) ~ Z,
TRUE ~ "none"))
# X Y Z all result
# <chr> <chr> <chr> <list> <chr>
#1 a a1 a2 <chr [2]> none
#2 b b1 b2 <chr [1]> none
#3 c c1 c2 <chr [2]> c1
#4 d d1 d2 <chr [2]> d2
我使用了ifelse、mapply和any遍历列表,并根据给定的条件生成值,如下所示
data$result <- ifelse(unlist(mapply(
data$all,data$Z,
FUN = function(x, y) {
any(x%in% y)
}
)), data$Z, ifelse(unlist(mapply(
data$all, data$Y,
FUN = function(x, y) {
any(x%in% y)
}
)), data$Y, "none"))
#View Data
data
这就产生了
我使用了ifelse、mapply和any遍历列表,并根据给定的条件生成值,如下所示
data$result <- ifelse(unlist(mapply(
data$all,data$Z,
FUN = function(x, y) {
any(x%in% y)
}
)), data$Z, ifelse(unlist(mapply(
data$all, data$Y,
FUN = function(x, y) {
any(x%in% y)
}
)), data$Y, "none"))
#View Data
data
这就产生了
它似乎也不像我预期的那样起作用。这是我的错,我没有为再现性输入正确的数据。似乎all列上的任何操作都会对该列的所有值进行操作,而不仅仅是对行的值进行操作。我将编辑我的帖子以使其更清晰。@Meshuggahat我们可以按行添加,更新答案。它似乎也不像我预期的那样工作。这是我的错,我没有为再现性输入正确的数据。似乎all列上的任何操作都会对该列的所有值进行操作,而不仅仅是对行的值进行操作。我将编辑我的帖子以使其更清晰。@meshugga我们可以添加行方式,更新答案。data%>%rowwise%>%mutateresult=case_whenY%in%unstall~Y,Z%in%unstall~Z,TRUE~没有人应该做你想做的事data%>%rowwise%>%mutateresult=case_whenY%in%unstall~Y,Z%unstall~Z,TRUE~没有人应该做你想做的事