我已经使用此功能很多次了,但是直到现在我才想“为什么它起作用?”。R的colnames()函数如何为数据帧分配新的列名?我的意思是我知道colnames(df)将如何返回数据框的列名。但是如何分配新的呢?
aa <- mtcars
colnames(aa)
colnames(aa) <- LETTERS[1:ncol(aa)]
colnames(aa)
# ^ how can colnames function either return column names or assign new ones? It's just a function.
# but we can't change the number of columns this way:
ncol(aa)
ncol(aa) <- 10
Run Code Online (Sandbox Code Playgroud)
到目前为止,colnames函数为:
function (x, do.NULL = TRUE, prefix = "col")
{
if (is.data.frame(x) && do.NULL)
return(names(x))
dn <- dimnames(x)
if (!is.null(dn[[2L]]))
dn[[2L]]
else {
nc <- NCOL(x)
if (do.NULL)
NULL
else if (nc > 0L)
paste0(prefix, seq_len(nc))
else character() …Run Code Online (Sandbox Code Playgroud) 以下是R中"ave"函数的源代码:
function (x, ..., FUN = mean)
{
if (missing(...))
x[] <- FUN(x)
else {
g <- interaction(...)
split(x, g) <- lapply(split(x, g), FUN)
}
x
}
Run Code Online (Sandbox Code Playgroud)
我无法理解赋值"split(x,g)< - lapply(split(x,g),FUN)"是如何工作的.请考虑以下示例:
# Overview: function inputs and outputs
> x = 10*1:6
> g = c('a', 'b', 'a', 'b', 'a', 'b')
> ave(x, g)
[1] 30 40 30 40 30 40
# Individual components of "split" assignment
> split(x, g)
$a
[1] 10 30 50
$b
[1] 20 40 60
> lapply(split(x, …Run Code Online (Sandbox Code Playgroud) 我试图创建一个Append不返回值但直接扩展第一个变量的函数.目前,要追加y到x我做的
x = append(x,y)
Run Code Online (Sandbox Code Playgroud)
我希望能够做到
Append(x,y)
Run Code Online (Sandbox Code Playgroud)
并得到相同的结果.我首先想到的是类似的东西
Append = function(a,b,VarName) assign(VarName,append(a,b), envir = .GlobalEnv)
Append(x,y,"x")
Run Code Online (Sandbox Code Playgroud)
它有效,但必须传递原始变量的名称是非常不满意的.有更好的解决方案吗?
我有一段代码,用于更新对象的类。但是我必须打破代码的跟随才能分配课程。是否有一种优雅的方式来分配课程但继续管道,所以我有一个管道一直到最终结果?我怀疑 {purrr} 中可能有什么东西?
library(disk.frame)
library(dplyr)
library(tidyquery)
a = nycflights13::airports %>%
as.disk.frame
class(a) <- c(class(a), "data.frame")
a %>%
query("SELECT name, lat, lon ORDER BY lat DESC LIMIT 5")
Run Code Online (Sandbox Code Playgroud)