鉴于几个.xls具有不同页数的文件,我读他们到R使用read.xls从gdata包.我有两个相关的问题(解决第二个问题应解决第一个问题):
.xls文件将有多少张纸,实际上这个值会因文件而异.现在,要解决(1),我正在使用try()并迭代工作表编号,直到我遇到错误.
如何获取工作表名称列表以便我可以迭代它们?
后续如何使用`[[`和`$`作为函数?问题:我开始玩原始设置(为简单起见,将尺寸从10000缩小到3)
JSON <- rep(list(x,y),3)
x <- list(a=1, b=1)
y <- list(a=1)
JSON <- rep(list(x,y),3)
sapply(JSON, "[[", "a")
[1] 1 1 1 1 1 1
sapply(JSON,"[[",'b')
[[1]]
[1] 1
[[2]]
NULL
[[3]]
[1] 1
[[4]]
NULL
[[5]]
[1] 1
[[6]]
NULL
sapply(JSON,'[[',1)
[1] 1 1 1 1 1 1
sapply(JSON,'[[',2)
Error in FUN(X[[2L]], ...) : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
我认为我理解 - 搜索"b"与要求存在第二个元素不同.但后来,我创建了一个更深入的列表:
NOSJ<-rep(list(JSON),3)
sapply(NOSJ,'[[',1)
[,1] [,2] [,3]
a 1 1 1
b 1 1 1
sapply(NOSJ,'[[',2)
$a
[1] 1 …Run Code Online (Sandbox Code Playgroud) 我想用以下方式用逻辑矩阵对数值向量进行子集化:给定向量y
y <- c(4,8,1,3,5,7)
Run Code Online (Sandbox Code Playgroud)
和逻辑矩阵lmat
lmat <- t(matrix(c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, TRUE, FALSE, FALSE, FALSE, FALSE,
TRUE, TRUE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, TRUE, FALSE, FALSE, FALSE,
TRUE, FALSE, TRUE, FALSE, FALSE, FALSE), ncol = 6))
Run Code Online (Sandbox Code Playgroud)
看起来像这样
> lmat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE TRUE FALSE FALSE FALSE FALSE
[4,] TRUE TRUE FALSE …Run Code Online (Sandbox Code Playgroud) 我试图从数据集中收集一些摘要统计数据的自举估计值,但我想以不同的速率重新采样部分数据集,这使我依赖于嵌套的for循环.
具体来说,假设我的数据集中有两个组,每个组进一步分为测试和控制.第1组具有75%/ 25%的测试控制比,第2组具有50%/ 50%的测试控制比.
我想重新采样,使得数据集大小相同,但两组的测试控制比率均为90%/ 10%...换句话说,以不同的速率对不同的子组进行重新采样,这让我感觉不同于boot包通常会.
在我的数据集中,我创建了一个group表示组的groupT变量,以及一个表示与test/control连接的组的变量,例如:
id group groupT
1 1 1T
2 1 1T
3 2 2T
4 1 1C
5 2 2C
Run Code Online (Sandbox Code Playgroud)
这是我现在正在运行的,nreps任意设置为我的引导复制数:
for (j in 1:nreps){
bootdat <- datafile[-(1:nrow(datafile)),] ## initialize empty dataset
for (i in unique(datafile$groups)){
tstring<-paste0(i,"T") ## e.g. 1T
cstring<-paste0(i,"C") ## e.g. 1C
## Size of test group resample should be ~90% of total group size
tsize<-round(.90*length(which(datafile$groups==i)),0)
## Size of control group resample should be total …Run Code Online (Sandbox Code Playgroud) 我有一个列表/向量列表:
list(c("cat1", "cat6", ""), c("cat5", "cat3", "cat4"), c("cat6",
"cat4", ""), c("cat5", "cat1", "cat2", "cat4"), c("cat6", "cat3",
"cat2"))
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种优雅的方法来删除 nchar=0 的内部元素,例如第一个列表中的第三个元素(值为“”)。我努力了:
l[lapply(l,length)>0]
Run Code Online (Sandbox Code Playgroud)
但这不适用于内部元素长度,而是适用于外部列表元素长度。预期输出是:
list(c("cat1", "cat6"), c("cat5", "cat3", "cat4"), c("cat6",
"cat4"), c("cat5", "cat1", "cat2", "cat4"), c("cat6", "cat3",
"cat2"))
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏
我想在 R 中应用 grep(),但我不太擅长 lapply()。我知道 lapply 能够获取一个列表,将函数应用于每个成员并输出一个列表。例如,假设x一个列表由 2 个成员组成。
> x<-strsplit(docs$Text," ")
>
> x
[[1]]
[1] "I" "lovehttp" "my" "mum." "I" "love"
[7] "my" "dad." "I" "love" "my" "brothers."
[[2]]
[1] "I" "live" "in" "Eastcoast" "now." "Job.I"
[7] "used" "to" "live" "in" "WestCoast."
Run Code Online (Sandbox Code Playgroud)
我想应用 grep() 函数来删除由 http 组成的单词。所以,我会申请:
> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE))
Run Code Online (Sandbox Code Playgroud)
但它不起作用,它说
Error in grep(pattern = "http", invert = TRUE, value = TRUE) :
argument "x" is missing, with no default
Run Code Online (Sandbox Code Playgroud)
所以,我试过了
> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE,x))
Run Code Online (Sandbox Code Playgroud)
但它说
Error …Run Code Online (Sandbox Code Playgroud) 我需要一次增长一个 python DataFrame 一行。
在 R 中,该sapply()函数快速而高效。例如,
sapply(1:100, function(i) rnorm(50) )
Run Code Online (Sandbox Code Playgroud)
产生一个 50 x 100 的(标准正态随机)数字矩阵,然后可以根据需要转置和/或转换为数据帧
如何在python中有效地做同样的事情?
我正在尝试为具有多个组的数据框的多列找到不包括 NA 的方法
airquality <- data.frame(City = c("CityA", "CityA","CityA",
"CityB","CityB","CityB",
"CityC", "CityC"),
year = c("1990", "2000", "2010", "1990",
"2000", "2010", "2000", "2010"),
month = c("June", "July", "August",
"June", "July", "August",
"June", "August"),
PM10 = c(runif(3), rnorm(5)),
PM25 = c(runif(3), rnorm(5)),
Ozone = c(runif(3), rnorm(5)),
CO2 = c(runif(3), rnorm(5)))
airquality
Run Code Online (Sandbox Code Playgroud)
所以我得到一个带有数字的名称列表,所以我知道要选择哪些列:
nam<-names(airquality)
namelist <- data.frame(matrix(t(nam)));namelist
Run Code Online (Sandbox Code Playgroud)
我想按城市和年份计算 PM25、臭氧和二氧化碳的平均值。这意味着我需要第 1,2,4,6:7 列)
acast(datadf, year ~ city, mean, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
但这并不是我真正想要的,因为它包含了我不需要的东西的平均值,而且它不是数据帧格式。我可以转换它然后删除,但这似乎是一种非常低效的方法。
有没有更好的办法?
我试图总结数据集中许多不同列(变量)的均值、标准差等。我编写了自己的汇总函数以准确返回我需要的内容,并使用 sapply 一次将此函数应用于所有变量。它工作正常,但是返回的数据框没有列名,我似乎甚至无法使用列号引用重命名它们 - 也就是它们似乎无法以任何方式使用。
我的代码如下 - 因为我只是在查找汇总统计信息,所以我只想使用相同的列(变量)名称,有 4 行(平均值、标准差、最小值、最大值)。有什么办法可以做到这一点(即使是我手动更改列名称的缓慢方法)
#GENERATING DESCRIPTIVE STATISTICS
sfsum= function(x){
mean=mean(x)
sd=sd(x)
min=min(x)
max=max(x)
return(c(mean,sd,min,max))
}
#
c= list(sfbalanced$age_child, sfbalanced$earnings_child,
sfbalanced$logchildinc ,sfbalanced$p_inc84, sfbalanced$login84,
sfbalanced$p_inc85, sfbalanced$login85, sfbalanced$p_inc86,
sfbalanced$login86, sfbalanced$p_inc87, sfbalanced$login87,
sfbalanced$p_inc88, sfbalanced$login88)
summ=sapply(c,sfsum)
names(summ)
NULL
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 sapply 和 switch 将描述性名称应用于数据。我已经多次使用这种方法,没有出现任何问题,但对于我最近的项目中的(只有一个!)专栏,它抛出了错误。我最好的猜测是,即使该值保存为字符串,该值也将是 R 中的保留字。我在下面创建了一个可重现的示例。
我的项目中的实际值与性别无关,并且可能有许多可能的选择。有人可以告诉我如何使用 sapply/switch 来避免代码中出现许多嵌套的 ifelse 语句吗?
# create test data
testdta <- as.data.frame(cbind(userid = c("1", "2", "3", "4"), gender = c("F", "M", "F", "M")))
# sapply/switch works with strings that are not reserved words
testdta$uiddescription <- sapply(testdta$userid, switch, "1" = "1 - first", "2" = "2 - second", "3+ - third or beyond")
testdta
# sapply/switch won't work when trying to interpret gender (possibly because F is reserved?)
testdta$gdescription <- sapply(testdta$gender, switch, "F" = …Run Code Online (Sandbox Code Playgroud)