我可以使用“function”命令来调用日期帧的某些行吗?[关闭]

Can I use the "function" command to call certain rows of a dateframe? [closed]

提问人:MMamone 提问时间:10/31/2023 更新时间:10/31/2023 访问量:48

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

19天前关闭。

我有一个数据帧,其中包含许多站点的物种存在/缺失数据。这是它外观的基本表示形式。

df=data.frame(site=c("site1","site1","site1","site2","site2","site2"),
           speciesA=c(0,1,0,1,1,0),speciesB=c(0,0,0,1,0,1),speciesC=c(1,0,1,1,1,1))

我希望能够单独处理特定站点(也就是站点列中具有相同名称的特定行)。

我能够使用子集来隔离一个站点。

subset(df[df$site=="site1", ])

我尝试使用一个函数为所有站点执行此操作,而无需写出完整的代码,

sitename<-function(s){
   subset(df[df$site=="s", ])
}
sitename(site2)

但这会返回 <0 行>(或 0 长度的 row.names)。

r

评论

2赞 Gregor Thomas 10/31/2023
不要在周围加上引号。 是已定义为函数参数的 R 对象。 是包含字母“s”的字符串。"s"s"s"
2赞 Gregor Thomas 10/31/2023
此外,您正在混合 2 个不同的子集语法。它有效,但没有必要,并且可能导致错误。您可以使用 或 ,您不需要将它们混合在一起(这样做可能是一个坏主意)。subset(df, site == s)df[df$site == s, ]
0赞 r2evans 10/31/2023
注意:来自 ?subset:“这是一个旨在以交互方式使用的便利功能。对于编程,最好使用像 [ 这样的标准子集函数,特别是对参数“子集”的非标准计算可能会产生意想不到的后果。我可以确认,以编程方式使用 of 失败并不难,有时是无声的。subset
0赞 r2evans 10/31/2023
但有趣的是,你的使用没有做任何事情:没有使用参数,也没有使用参数,所以你使用 的完全是一个恒等函数(有开销)。subsetsubset=select=subset(.)
0赞 r2evans 10/31/2023
我投票说这是一个错别字。也许不是技术上的,但也许这更像是一个学习时刻:在 R 中,文字字符串将“永远不会”引用函数参数的值,除非它被传递给知道查找它的东西,例如 or 、 或 in ,或者作为列选择器,如 in(当然,这不是你想要的)。由于您将其用作中缀运算符的参数,因此您正在寻找文字(无论变量包含什么)。"s"getmget`[``[[`df[, "s"]=="s"s

答:

2赞 phydev 10/31/2023 #1

问题是你的输入变量在引号内。此外,在传递输入时应使用引号。请尝试以下操作:

sitename <- function(s){
   df[df$site==s, ]
}

sitename("site2")

编辑:正如其他人所注意到的那样,这里完全没用。subset()

评论

0赞 r2evans 10/31/2023
subset在这里不做任何事情,不应该以编程方式使用。这应该与 完全相同。df[df$site==s, ]
1赞 phydev 10/31/2023
同意,但子集的使用不是问题的原因。它不是必需的,但它有效。无论如何,我删除了它。
3赞 r2evans 10/31/2023
我同意冗余不是问题,坦率地说,我认为这个答案解释了真正的问题,而两个答案都解决了它。我认为这要么是错别字,要么是编程学习时刻,其中 != ,正如您所强调的。希望 OP 能够实现实际的收获,并可能了解 -caution。=="s"==ssubset
2赞 MrFlick 10/31/2023 #2

您在此处使用子集有点多余,因为您也在索引数据框。您应该使用

sitename <- function(s){
   subset(df, site==s)
}

sitename <- function(s){
   df[df$site==s, ]
}

以及

sitename("site1")

评论

0赞 phydev 10/31/2023
冗余不是代码不起作用的原因。看看我的答案。