我有以下清单
test_list=list(list(a=1,b=2),list(a=3,b=4))
Run Code Online (Sandbox Code Playgroud)
我想用列表元素名称提取所有元素a.
我可以通过这样做
sapply(test_list,`[[`,"a")
Run Code Online (Sandbox Code Playgroud)
这给了我正确的结果
#[1] 1 3
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Rs美元运算符时$,我得到了NULL
sapply(test_list,`$`,"a")
#[[1]]
#NULL
#
#[[2]]
#NULL
Run Code Online (Sandbox Code Playgroud)
但是,如果我在单个元素上使用它,test_list它会按预期工作
`$`(test_list[[1]],"a")
#[1] 1
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?
我有一个字符列表列表.例如:
l <- list(list("A"),list("B"),list("C","D"))
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到一些元素是长度> 1的列表.
我想将此列表列表转换为字符向量,但我希望长度> 1的列表在字符向量中显示为单个元素.
该unlist功能并没有做到这一点,而是:
> unlist(l)
[1] "A" "B" "C" "D"
Run Code Online (Sandbox Code Playgroud)
还有什么比:
sapply(l,function(x) paste(unlist(x),collapse=""))
Run Code Online (Sandbox Code Playgroud)
为了得到我想要的结果:
"A" "B" "CD"
Run Code Online (Sandbox Code Playgroud) 我想确定一个大型data.table的列类.
colClasses <- sapply(DT, FUN=function(x)class(x)[1])
Run Code Online (Sandbox Code Playgroud)
有效,但显然本地副本存储在内存中:
> memory.size()
[1] 687.59
> colClasses <- sapply(DT, class)
> memory.size()
[1] 1346.21
Run Code Online (Sandbox Code Playgroud)
循环似乎不可能,因为data.table"with = FALSE"总是产生data.table.
一种快速而又非常脏的方法是:
DT1 <- DT[1, ]
colClasses <- sapply(DT1, FUN=function(x)class(x)[1])
Run Code Online (Sandbox Code Playgroud)
最优雅,最有效的方法是什么?
我想学习如何在我的数据帧的特定列上应用函数,而不"排除"我的df中的其他列.例如,我想将一些特定列乘以1000,并保留其他列.
使用sapply函数,例如:
a<-as.data.frame(sapply(table.xy[,1], function(x){x*1000}))
Run Code Online (Sandbox Code Playgroud)
我得到新的数据帧,第一列乘以1000,但没有我在操作中没有使用的其他列.所以我的尝试就是这样做:
a<-as.data.frame(sapply(table.xy, function(x) if (colnames=="columnA") {x/1000} else {x}))
Run Code Online (Sandbox Code Playgroud)
但是这个没用.
我的解决方法是为两个数据帧提供另一行ID,然后将旧数据框与新创建的数据框合并以获得完整的数据帧.但我认为必须有更好的解决方案.不是吗?
我定义了一个自定义函数,如下所示:
my.fun = function() {
for (i in 1:1000) {
...
for (j in 1:20) {
...
}
}
return(output)
}
Run Code Online (Sandbox Code Playgroud)
返回一个输出矩阵,output由1000行和20列组成.
我需要做的是重复这个函数说5次并将五个output结果存储到一个全新的矩阵中,比如说final,但不使用另一个for循环(这样可以使代码更清晰,也是因为在第二个时刻我我想尝试并行化这些额外的5次重复).
因此final应该是一个包含5000行和20列的矩阵(这5次重复的基本原理是在我使用的两个for循环中,以及其他函数中sample).
我尝试使用final <- replicate(5, my.fun()),正确计算了五个重复,但后来我必须"手动"将元素放入一个全新的5000 x 20矩阵中......有更好的方式吗?(也许用sapply()?).非常感谢
我有一个矩阵:
mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
Run Code Online (Sandbox Code Playgroud)
并且我应用以下函数来过滤掉只有正条目的列,但是对于具有负条目的列,我得到了一个NULL.如何NULL从输出中抑制s lapply,apply和sapply?
> lapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 0 0
> sapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0
$V2
[1] 1 1 1 1
$V3
NULL
$V4
[1] 0 0 …Run Code Online (Sandbox Code Playgroud) 当我第一次开始在RI中编程时,通常会使用dplyr count().
library(tidyverse)
mtcars %>% count(cyl)
Run Code Online (Sandbox Code Playgroud)
一旦我开始使用apply函数,我开始遇到count()的问题.如果我简单地将ungroup()添加到我的计数结束(),那么问题就会消失.
我没有任何特别的可复制品来展示.但有人可以解释问题可能是什么,为什么ungroup()总是修复它,并且在每次count()之后或者在任何group_by()之后一直使用ungroup()有任何缺点吗?当然,我假设我不再需要在计算或汇总后对数据进行分组.
mtcars %>% count(cyl) %>% ungroup()
Run Code Online (Sandbox Code Playgroud) 我有这个字符串向量(例如):
str <- c("this is a string current trey",
"feather rtttt",
"tusla",
"laq")
Run Code Online (Sandbox Code Playgroud)
为了计算这个向量中的单词数,我使用了这个(这里给出的数字计算R中字符串中的单词数量,这可能是重复但有另一个问题)
No_words <- sapply(gregexpr("\\W+", str), length) + 1
Run Code Online (Sandbox Code Playgroud)
但它回来了
6 2 2 2
Run Code Online (Sandbox Code Playgroud)
String在最后两个位置只有1个元素(即"tusla"和"laq")
所以应该回来
6 2 1 1
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我需要获取至少有1个NA的列的名称.
df<-data.frame(a=1:3,b=c(NA,8,6), c=c('t',NA,7))
Run Code Online (Sandbox Code Playgroud)
我需要得到"b,c".
我找到了这段代码:
Run Code Online (Sandbox Code Playgroud)sapply(df, function(x) any(is.na(x)))
但我只需要有任何NA的变量.
我试过这个:
sapply(df, function(x) colnames(df[,any(is.na(x))]))
Run Code Online (Sandbox Code Playgroud)
但我得到了所有的列名.
为什么两个功能fn和gn以下不同?我不认为他们应该,但我必须遗漏一些东西.
vars <- letters[1:10]
a <- b <- 1
fn <- function (d) {
sapply( vars, exists )
}
gn <- function (d) {
sapply( vars, function (x) { exists(x) } )
}
fn(d=2)
# a b c d e f g h i j
# TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
gn(d=2)
# a b c d e f g h i j
# TRUE TRUE TRUE TRUE FALSE FALSE FALSE …Run Code Online (Sandbox Code Playgroud)