【问题标题】:Error in Apply function: "arguments imply differing number of rows: 1, 0"Apply 函数中的错误:“参数暗示不同的行数:1、0”
【发布时间】:2016-08-05 19:33:24
【问题描述】:

我有一个数据框。我需要搜索列“a”,如果“a”等于“foo”,则“b”列等于“found”

a <- c("foo", "bar", "baz", "foo")
b <- c(0, 0, 0, 0)
df <- data.frame(a, b)

f <- function (x){
  if (x["a"] == "foo"){
    x["b"] <- "confirm"
  }
}

result <- apply(df, 1, f)

预期的结果是

a        b
"foo"    "confirm"
"bar"    0
"baz"    0
"foo"    "confirm"

但是当我这样做时,结果返回:

 [[1]]
[1] "confirm"

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] "confirm"

并且 View(result) 给出错误: 视图中的错误:参数暗示不同的行数:1、0

是否为数据框添加了另一个维度?

【问题讨论】:

  • 一个函数需要return(x)结尾。
  • 我添加了return(x),但结果我的行和列被转置了。
  • 是的,这是使用apply 的负面影响。人们通常只是在最后使用t() 来反转它或尽量避免使用apply
  • 谢谢@Frank,转置为我完成了。并感谢您提出退货方式。

标签: r dataframe apply


【解决方案1】:

您可以使用来自 dplyr 的 ifelsemutate 命令轻松完成此操作

library(dplyr)
a <- c("foo", "bar", "baz", "foo")
b <- c(0, 0, 0, 0)
df <- data.frame(a, b)

result <- df %>%
    mutate(b = ifelse(a == "foo", "confirm", b))

# a       b
# 1 foo confirm
# 2 bar       0
# 3 baz       0
# 4 foo confirm

如果您想编写自己的函数,请确保它有一个返回语句(正如弗兰克在他的评论中所说)。

【讨论】:

    【解决方案2】:

    仅使用基础包:

    result &lt;- data.frame(a, b=(ifelse(a=="foo","found",b)))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2021-01-01
      • 1970-01-01
      相关资源
      最近更新 更多