R 嵌套数据帧在使用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

我试图在嵌套的数据帧中使用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]>
我想保留
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)
@TobKel
is_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))