函数不能嵌入另一个函数中

Tor*_*ten 2 r unique plyr distinct-values

在我的数据集中是具有多个不同名称的ID.为了检测它们,我建立了这个功能:

ddply(my_dataframe, ~ID_col, summarise, number_of_names = length(unique(names_col)))
Run Code Online (Sandbox Code Playgroud)

这很好用,所以我在第一个col中得到一个带有ID的表,在第二个col中得到不同名称的数量.

因为我需要对几个ID /名称对执行此操作,所以我决定将ddply函数放在函数中.我做了如下:

function_name = function (source, id, name) {
  ddply(source, ~id, summarise, number_of_names = length(unique(name)))
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我使用它时会抛出错误:

function_name(my_dataframe, ID_col, names_col)
# Error in unique.default(x) : unique() applies only to vectors
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它与之前的代码完全相同,但嵌入了具有三个变量的函数中.我迫不及待地想要修复它并且真的期待解决方案.

仅供参考:在我的原始代码中,我没有使用"源"或"名称"而是使用德语单词,因此对于现有的其他功能应该没有问题.我也试过把变量放在引号中.

谢谢你的帮助!

这就是DF有点像:

my_dataframe <- data.frame(
  ID_col = c(letters[2:9], letters[3:4]),
  names_col = paste0("name-", letters[1:10])
)
Run Code Online (Sandbox Code Playgroud)

有303个ID,但有963个名字.

Spa*_*man 6

R始终具有通过使用双方括号按变量名的值选择列的功能.使用tapply你可以这样做:

function_name = function (source, id, name) {
    data.frame(
       N=tapply(
           source[[name]],
           my_dataframe[[id]],
           function(x){
             length(unique(x))
             }
          )
        )
  }
Run Code Online (Sandbox Code Playgroud)

然后:

> function_name(my_dataframe,"ID_col","names_col")
      N
FU181 2
FU901 1
FU992 1
Run Code Online (Sandbox Code Playgroud)

请注意,名称位于返回数据框的行名称中.

  • 嗨Spacedman,谢谢你的快速反应.完全像它应该工作!也非常欣赏,你使用了"基本操作".因此,像我这样的新手更容易理解代码在做什么! (2认同)