R 嵌套数据帧在使用ifelse条件进行变异后丢失格式
我试图在嵌套的数据帧中使用ifelse条件变异一个新变量。但问题是,在实现ifelse条件后,嵌套的数据帧会变成一个列表。 我想展示R 嵌套数据帧在使用ifelse条件进行变异后丢失格式,r,if-statement,nested,R,If Statement,Nested,我试图在嵌套的数据帧中使用ifelse条件变异一个新变量。但问题是,在实现ifelse条件后,嵌套的数据帧会变成一个列表。 我想展示iris数据集的这个问题: 在这里可以看到原始嵌套格式: iris %>% nest(data = -Species) # A tibble: 3 x 2 Species data <fct> <list> 1 setosa <tibble [50
iris
数据集的这个问题:
在这里可以看到原始嵌套格式:
iris %>% nest(data = -Species)
# A tibble: 3 x 2
Species data
<fct> <list>
1 setosa <tibble [50 x 4]>
2 versicolor <tibble [50 x 4]>
3 virginica <tibble [50 x 4]>
我想保留tibble
-格式,即使使用ifelse
-条件
有人能帮我吗?在
map()
计算的第一步,即setosa
中的数据中,自定义函数的输入x
实际上是
x <- iris[1:50, 1:4]
第一部分是!is.na(x)
,它返回50x4=200
逻辑值。因此,第二部分和第三部分将回收到长度200。然而,第二部分,即
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)
是一个包含5个变量的tibble
,也是一个长度为5的列表,因此此tibble
中的每个变量将循环使用40次,随后将创建一个长度为200的列表。这就是为什么会有3个长度为200的列表
在您的情况下,ifelse()
可能不适用。你可以把它调整到
iris %>%
nest(data = -Species) %>%
add_row(Species = "example", data = NA) %>%
mutate(data = map(data, function(x) {
if(is.data.frame(x))
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)
else
NULL
}))
# # A tibble: 4 x 2
# Species data
# <chr> <list>
# 1 setosa <tibble [50 × 5]>
# 2 versicolor <tibble [50 × 5]>
# 3 virginica <tibble [50 × 5]>
# 4 example <NULL>
我认为必须先创建新列,然后执行ifelse条件。比如说。。。map(…函数(x)mutate(x,ifelse(…))
在我的原始数据集中,这是不可能的,因为数据中有一些NA
-值。因此,首先我必须使用ifelse-function“过滤”数据。但是,只有在没有NAs的情况下,才能进行变异。你在变异,然后处理这些条件。所以ifelse(!is.na(x),x^2,x)
。但也许我在你的解释中遗漏了一些东西。它使用的是if
-函数,而不是ifelse
-函数。谢谢你的回答。但是我在原始数据集中的数据-column中有NA
-值。因此,您的代码在我的示例中不起作用。此示例数据集将是更好的基础:iris%%>%nest(data=-Species)%%>%add_row(Species=“example”,data=NA)
在我的示例中,它现在可以与if
-函数一起工作,但不能与ifelse
-函数一起工作。我无法解释为什么。此外,我现在使用is_tible(x)
:如果(is_tible(x))x%>%变异(“萼片长度^2”=萼片长度^2)
@TobKelis_tible(x)
很棒。请注意,ifelse()
并不等同于if…else…
。它们适用于不同的情况。您可以搜索?ifelse
,以获取更多详细信息。@27ñ9感谢您的回复。但我倾向于对OP的代码进行最小的修改来回答这个问题,并将重点放在ifelse()
和if…else
的区别上。我会把你的建议加入我的答案中。这是一个很好的观点。
ifelse(!is.na(x), # part 1
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2), # part 2
NA) # part 3
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)
iris %>%
nest(data = -Species) %>%
add_row(Species = "example", data = NA) %>%
mutate(data = map(data, function(x) {
if(is.data.frame(x))
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)
else
NULL
}))
# # A tibble: 4 x 2
# Species data
# <chr> <list>
# 1 setosa <tibble [50 × 5]>
# 2 versicolor <tibble [50 × 5]>
# 3 virginica <tibble [50 × 5]>
# 4 example <NULL>
iris %>%
nest(data = -Species) %>%
add_row(Species = "example", data = NA) %>%
mutate(data = map_if(data, is_tibble,
~ mutate(.x, `Sepal.Length^2` = Sepal.Length^2),
.else = NULL))