小编Mar*_*ler的帖子

将4维数组转换为R中的2维数据集

我想将一个4维数组转换成一个二维数据集.我提出了两种方法的代码:一种方法使用暴力方法涉及cbindrbind第二种方法使用嵌套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)

r

5
推荐指数
1
解决办法
1187
查看次数

转置数据集

我想转置类似于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)

r

4
推荐指数
2
解决办法
2468
查看次数

加权意味着按组和列

我希望按几个(实际上大约60个)列中的每一列获得加权平均值.这个问题非常类似于:刚刚提出的数据框中重复应用ave计算组意味着.

到目前为止,我已经提出了两种方法来获得加权平均值:

  1. sapply为每列使用单独的语句
  2. 在...中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)

for-loop r apply sapply

4
推荐指数
1
解决办法
7358
查看次数

拆分字符串而不丢失字符

我希望将字符串拆分为某个字符,同时将该字符保留在第二个结果字符串中.我可以实现几乎所有所需的操作,除了我丢失了我指定的字符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)

regex split r strsplit

4
推荐指数
1
解决办法
606
查看次数

是 2 的幂

如何判断一个数是否是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 上有许多类似的问题,答案似乎涉及位模式。这种方法可以用于 …

largenumber r

4
推荐指数
2
解决办法
1145
查看次数

在最后一个字符旁边分割字符串

我有一个数字变量,DATE表示最后两个字符的日期MONTH和前一个或两个字符DAY.我想列分成单独的列的MONTHDAY.

我可以使用以下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)

regex r

4
推荐指数
1
解决办法
111
查看次数

R:向量中的编号元素

我想对矢量的元素进行编号,将"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)

谢谢你的任何建议.我正在尝试通过编程提高效率.

马克米勒

r

3
推荐指数
1
解决办法
874
查看次数

当一个变量实际上是两列时,expand.grid

我有一个区,县和年的数据集.如果某个地区/县组合在任何一年发生,我希望每年都能实现这种组合.以下是我想到的两种方法.第一种方法使用函数来创建区,县和年的组合,并且只需要六行代码.底层方法使用了组合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)

merge r unique paste strsplit

3
推荐指数
1
解决办法
1727
查看次数

跳过或忽略目录中的空 csv 文件 - R

csv我的目录中有一堆文件。有些文件是空的。我可以使用以下代码删除空文件:

删除目录中的空 csv 文件 - R

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)

csv r

3
推荐指数
1
解决办法
2062
查看次数

max 在 R 中返回负无穷大

我偶然发现了一个看似简单的问题,但我无法解决。我试图在不包含兴趣值的情况下使用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)

所以,我想也许最简单的解决方案就是转换-Inf0. 还有base R比下面更优雅的解决方案吗?一条单线?理想情况下,不会返回warning消息?

aaa <- max(which(ff == my.index))
aaa[is.infinite(aaa)] <- 0
aaa
[1] 0
Run Code Online (Sandbox Code Playgroud)

r infinity

3
推荐指数
1
解决办法
682
查看次数

标签 统计

r ×10

regex ×2

strsplit ×2

apply ×1

csv ×1

for-loop ×1

infinity ×1

largenumber ×1

merge ×1

paste ×1

sapply ×1

split ×1

unique ×1