gpt4 book ai didi

r - 嵌套数据帧在使用 ifelse 条件变异后丢失格式

转载 作者:行者123 更新时间:2023-12-04 09:27:39 27 4
gpt4 key购买 nike

我正在尝试使用 ifelse 条件改变嵌套数据框中的新变量。但问题是在实现 ifelse 条件后,嵌套的数据框变成了一个列表。
我想用 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]>
现在我想改变嵌套数据帧中的一个新变量:
iris %>%
nest(data = -Species) %>%
mutate(data = map(data, function(x)
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)))

# A tibble: 3 x 2
Species data
<fct> <list>
1 setosa <tibble [50 x 5]>
2 versicolor <tibble [50 x 5]>
3 virginica <tibble [50 x 5]>
此代码有效。 data -column 是 tibble 格式中所需的。
但是如果我现在插入 ifelse 条件,tibble 格式就会丢失:
iris %>%
nest(data = -Species) %>%
mutate(data = map(data, function(x)
ifelse(!is.na(x), x %>% mutate(`Sepal.Length^2` = Sepal.Length^2), NA)))

# A tibble: 3 x 2
Species data
<fct> <list>
1 setosa <list [200]>
2 versicolor <list [200]>
3 virginica <list [200]>
我要保留 tibble -format 甚至使用 ifelse -健康)状况。
谁能帮我?

最佳答案

map()的第一步计算,即 setosa 中的数据, 输入 x您的自定义功能实际上是

x <- iris[1:50, 1:4]
然后你把 x进入 ifelse()
ifelse(!is.na(x),                                        # part 1
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2), # part 2
NA) # part 3
第一部分是 !is.na(x) ,返回 50x4=200逻辑值。因此,第二部分和第三部分将被回收到长度为 200。但是,第二部分,即
x %>% mutate(`Sepal.Length^2` = Sepal.Length^2)
tibble有 5 个变量,这也是一个 list长度为 5,所以这个 tibble 中的每个变量将被回收 40 次,随后是 list将创建长度为 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>
确保 if() 中的条件必须是单个逻辑值。

感谢 @27φ9 更简洁的版本 map_if() :
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))

关于r - 嵌套数据帧在使用 ifelse 条件变异后丢失格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62950714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com