我发了一个 answer使用 dplyr
回答问题和 tidyr
.基于 this comment我用过 Map
建立答案。
接下来我尝试使用 base R
工具仅用于回答相同的问题,但这并没有按预期工作:
transform(
df,
Begin_New = Map(seq, Begin, End - 6000, list(by = 1000)) # or mapply(...)
)
导致错误:Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : Arguments imply different number of rows: 25, 33, 84, 36, 85, 165
哦,那好吧。这似乎不起作用,但是 为什么这个有效?
df2 <- data.frame(id = 1:4, nested = c("a, b, f", "c, d", "e", "e, f"))
transform(df2, nested = strsplit(nested, ", "))
据我了解 Map(seq, Begin, End - 6000, list(by = 1000))
和 strsplit(nested, ", ")
两者都返回 list()
包含向量。我错过了什么?我读了这个问题 Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : Arguments imply different number of rows: 1, 4, 5, 2但我仍然不知道,为什么这两个例子表现不同。
数据
df <- structure(list(ID = c("A01", "A01", "A01", "A01", "A01", "A01"
), Period = c("Baseline", "Run", "Recovery", "Baseline", "Run",
"Recovery"), Begin = c(0, 30500, 68500, 2000, 45000, 135000),
End = c(30500, 68500, 158000, 43000, 135000, 305000)), row.names = c(NA,
-6L), class = "data.frame")
最佳答案
我认为它与Create a data.frame where a column is a list有关.所以使用 I
禁止解释/转换对象。
transform(
df,
Begin_New = I(Map(seq, Begin, End - 6000, list(by = 1000)))
)
另一种方法是使用 list2DF
喜欢。transform(
df,
unusedName = list2DF(list(Begin_New = Map(seq, Begin, End - 6000,
list(by = 1000))))
)
正如@r2evans 已经指出的那样。在第一种情况下,您创建一个新列,在第二种情况下,您覆盖现有的列。
关于r - 为什么 mapply 不能按预期使用转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69013559/