我想将一个4维数组转换成一个二维数据集.我提出了两种方法的代码:一种方法使用暴力方法涉及cbind和rbind第二种方法使用嵌套for-loops.不过,我认为可能有更好的方法.谢谢你的任何建议.
R <- 3 # regions
M <- 5 # sites
J <- 2 # samples
T <- 4 # years
# 4-dim example array
y <- array(NA, dim = c(M, J, T, R))
# region 1
y[,1,1,1] = 1; y[,2,1,1] = 2;
y[,1,2,1] = 3; y[,2,2,1] = 4;
y[,1,3,1] = 5; y[,2,3,1] = 6;
y[,1,4,1] = 7; y[,2,4,1] = 8;
# region 2
y[,1,1,2] = 9; y[,2,1,2] = 10;
y[,1,2,2] = 11; y[,2,2,2] …Run Code Online (Sandbox Code Playgroud) 我想转置类似于my.data下面的数据集,然后对行进行求和.
my.data <- "landuse units year county.a county.b county.c county.d
apple acres 2010 0 2 4 6
pear acres 2010 10 20 30 40
peach acres 2010 500 400 300 200"
my.data2 <- read.table(textConnection(my.data), header = T)
my.data2
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
counties all.fruit
county.a 510
county.b 422
county.c 334
county.d 246
Run Code Online (Sandbox Code Playgroud)
我可以使用下面的代码执行此操作.但是,以下代码似乎必须是巨大的矫枉过正.我希望有一个更简单的解决方案.
# transpose the data set
tmy.data2 <- t(my.data2)
tmy.data2 <- as.data.frame(tmy.data2)
# assign row names to the data set
my.rows <- row.names(tmy.data2)
transposed.data <- cbind(my.rows, tmy.data2)
transposed.data
# …Run Code Online (Sandbox Code Playgroud) 我希望按几个(实际上大约60个)列中的每一列获得加权平均值.这个问题非常类似于:在刚刚提出的数据框中重复应用ave计算组意味着.
到目前为止,我已经提出了两种方法来获得加权平均值:
sapply为每列使用单独的语句sapply发表声明for-loop但是,我觉得必须有一种方法可以在apply语句中插入一个语句,sapply反之亦然,从而消除了for-loop.我尝试了许多排列而没有成功.我也看了看这个sweep功能.
这是我到目前为止的代码.
df <- read.table(text= "
region state county weights y1980 y1990 y2000
1 1 1 10 100 200 50
1 1 2 5 50 100 200
1 1 3 120 1000 500 250
1 1 4 2 25 100 400
1 1 4 15 125 150 200
2 2 1 1 10 50 150
2 2 2 10 10 …Run Code Online (Sandbox Code Playgroud) 我希望将字符串拆分为某个字符,同时将该字符保留在第二个结果字符串中.我可以实现几乎所有所需的操作,除了我丢失了我指定的字符strsplit,我猜这个字符称为分隔符.
有没有办法要求strsplit保留分隔符?或者我必须使用某种正则表达式吗?谢谢你的任何建议.这似乎是一个非常基本的问题.对不起,如果它是重复的.我更喜欢使用底座R.
这是一个显示我到目前为止的例子:
my.table <- read.table(text = '
model npar AICc
AA(~region+state+county+city)BB(~region+state+county+city)CC(~1) 17 11111.11
AA(~region+state+county)BB(~region+state+county)CC(~123) 14 22222.22
AA(~region+state)BB(~region+state)CC(~33) 13 33333.33
AA(~region)BB(~region)CC(~4321) 6 44444.44
', header = TRUE, stringsAsFactors = FALSE)
desired.result <- read.table(text = '
model CC npar AICc
AA(~region+state+county+city)BB(~region+state+county+city) CC(~1) 17 11111.11
AA(~region+state+county)BB(~region+state+county) CC(~123) 14 22222.22
AA(~region+state)BB(~region+state) CC(~33) 13 33333.33
AA(~region)BB(~region) CC(~4321) 6 44444.44
', header = TRUE, stringsAsFactors = FALSE)
split.model <- strsplit(my.table$model, 'CC\\(')
split.models <- matrix(unlist(split.model), ncol=2, byrow=TRUE, dimnames = list(NULL, c("model", "CC"))) …Run Code Online (Sandbox Code Playgroud) 如何判断一个数是否是2的幂?以下是我到目前为止的想法:
# check every number in a vector
y <- 1:100000000
x <- 2^(0:100)
y %in% x
y[(y %in% x)==TRUE]
# check a single number
y <- 250000
x <- 2^(0:100)
y %in% x
# check a single random number
y <- sample(1000000000,1)
x <- 2^(0:100)
y %in% x
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?上面的方法对我来说似乎不是很普遍,并且它在非常大的数字下失败,大概是因为四舍五入错误:
# 2^95 = 39,614,081,257,132,168,796,771,975,168
# correct
y <- 39614081257132168796771975168
x <- 2^(0:100)
y %in% x
# incorrect
y <- 39614081257132168796771975167
x <- 2^(0:100)
y %in% x
Run Code Online (Sandbox Code Playgroud)
其他语言的 Stack Overflow 上有许多类似的问题,答案似乎涉及位模式。这种方法可以用于 …
我有一个数字变量,DATE表示最后两个字符的日期MONTH和前一个或两个字符DAY.我想列分成单独的列的MONTH和DAY.
我可以使用以下R代码执行此操作.虽然我希望有一个更简单的regex解决方案.
my.data <- read.table(text = '
ID DATE VARX
A111 104 0
A111 204 1
A111 1004 4
A111 2004 4
B111 3004 2
C111 3004 3
C111 105 4
C111 1005 4
', header = TRUE, stringsAsFactors = FALSE)
# remove the last two characters of a string
my.data$DAY <- ifelse(nchar(my.data$DATE) == 3,
substr(my.data$DATE, nchar(my.data$DATE) - (nchar(my.data$DATE)-1), nchar(my.data$DATE) - (nchar(my.data$DATE)-1)),
substr(my.data$DATE, nchar(my.data$DATE) - (nchar(my.data$DATE)-1), …Run Code Online (Sandbox Code Playgroud) 我想对矢量的元素进行编号,将"1"分配给矢量中的最小元素.我知道怎么做,但我的解决方案(下面包含的代码)似乎过于复杂.有一个更简单的解决方案吗?
在下面的示例中,向量"数据"中有5个唯一的数字.数字3是最小的,应该分配数字'1'; 数字100是最大的,应该分配数字'5'.
矢量'数据'的理想解决方案是:c(2,3,4,4,3,1,5).
data <- c(5,8,12,12,8,3,100)
unique.numbers <- sort(unique(data))
numbering <- seq(1:length(unique(data)))
template <- cbind(numbering,unique.numbers)
output <- rep(NA, length(data))
for(i in 1:length(data)) {
for(j in 1:dim(template)[1]) {
if(data[i]==template[j,2]) output[i]=j
}
}
output
Run Code Online (Sandbox Code Playgroud)
谢谢你的任何建议.我正在尝试通过编程提高效率.
马克米勒
我有一个区,县和年的数据集.如果某个地区/县组合在任何一年发生,我希望每年都能实现这种组合.以下是我想到的两种方法.第一种方法使用函数来创建区,县和年的组合,并且只需要六行代码.底层方法使用了组合paste,expand.grid并且strsplit更加复杂/复杂.
可能有比上述更有效的方法.例如,是否有一种方法expand.grid可以实现区域/县/年组合,可能只有1或2行代码?
谢谢你的任何建议.我的职能可以胜任,但这个问题对我来说是一个学习的机会.我更喜欢基地R.
以下是示例数据集:
df.1 <- read.table(text = '
state district county year apples
AA EC A 1980 100
AA EC B 1980 10
AA EC C 1980 150
AA C G 1980 200
AA C other 1980 20
AA C I 1980 250
AA WC R 1980 300
AA WC S 1980 30
AA WC other 1980 350
AA EC A 1999 1100
AA EC D 1999 110
AA EC E …Run Code Online (Sandbox Code Playgroud) csv我的目录中有一堆文件。有些文件是空的。我可以使用以下代码删除空文件:
setwd('C:/Users/mmiller/Documents/simple R programs/')
my.folder <- paste0(getwd(), '/', 'empty_csv_files/')
setwd(my.folder)
my.delete.empty.csv = lapply(Filter(function(x) countLines(x)==0, list.files(pattern='.csv')), unlink)
my.model.files <- list.files(my.folder, pattern="^model.*?\\.csv")
my.model.list <- lapply(paste0(my.folder, my.model.files), read.csv)
my.model.data <- do.call(rbind, my.model.list)
Run Code Online (Sandbox Code Playgroud)
csv但是,此代码会从目录中物理删除(即销毁)空文件。有没有办法简单地跳过或忽略空csv文件而不是销毁它们?我对销毁文件感到有点不舒服,因为这似乎消除了所采取的所有步骤的清晰且现成的记录。例如,我可能不太清楚到底有多少文件被销毁。
以下是我在本示例中使用的文件的内容(model3.csv为空):
model1.csv
var1
1
2
3
model2.csv
var1
10
20
30
model3.csv
model4.csv
var1
100
200
300
model5.csv
var1
1000
2000
3000
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个看似简单的问题,但我无法解决。我试图在不包含兴趣值的情况下使用maxand 。理想情况下,我想获得这种情况下的号码。但我不断得到负无穷大。whichvector0
ff <- c(2, 4, 6, 8, 10)
my.index <- 1
max(which(ff == my.index))
#[1] -Inf
#Warning message:
#In max(which(ff == my.index)) :
# no non-missing arguments to max; returning -Inf
Run Code Online (Sandbox Code Playgroud)
以下是返回相同结果的其他一些尝试:
max(as.numeric(which(ff == my.index)))
max(which(ff == my.index), na.rm = TRUE)
max(as.numeric(which(ff == my.index)), na.rm = TRUE)
max(numeric(0))
Run Code Online (Sandbox Code Playgroud)
我确实注意到:
max(0)
[1] 0
Run Code Online (Sandbox Code Playgroud)
所以,我想也许最简单的解决方案就是转换-Inf为0. 还有base R比下面更优雅的解决方案吗?一条单线?理想情况下,不会返回warning消息?
aaa <- max(which(ff == my.index))
aaa[is.infinite(aaa)] <- 0
aaa
[1] 0
Run Code Online (Sandbox Code Playgroud)