小编sah*_*ahn的帖子

是否有一种优雅的 tidyverse 方法来批量重命名列?

我正在使用一个由 Google 表单构建的小型数据集。列名称是完整的调查问题,例如。

“1.哪个团队最能描述您的工作?”
“2.你是经理吗?”
“3.你和x在一起多久了?”

我想将所有这些列重命名为“1”、“2”、“3”等。我知道我可以执行以下操作,但我希望有一种更优雅/更快的方法。像这样的柱子有23根。

survey %>% rename_with(
  `1` = `1. What team most describes your work?`,
  `2` = `2. Are you a manager?`...
Run Code Online (Sandbox Code Playgroud)

这可行,但编写速度很慢。tidyverse 有谁有更好的吗?我对 R 和编码总体来说是新手,所以任何建议都值得赞赏。

r rename dplyr

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

两个条件的累加和

给出的数据是虚构的,实际上它们更复杂

t <- data.frame(v1=c(265, -268, 123, 58, 560, 56, -260, 40, 530, -895, 20))
Run Code Online (Sandbox Code Playgroud)

我想计算具有两个限制值的累积和:0和500。如果累积总数超过500,则必须保留500。如果累积总数变为负数,则必须存储0。得到的结果如下:

     v1 sum.c
1   265   265
2  -268     0
3   123   123
4    58   181
5   560   500
6    56   500
7  -260   240
8    40   280
9   530   500
10 -895     0
11   20    20
Run Code Online (Sandbox Code Playgroud)

Excel中的公式如下:=if(B1+A2<0; 0; if(B1+A2>500; 500; B1+A2))

有任何想法吗?

r dplyr

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

为什么我不能使用或改变 R data.table 中创建的新列?

我想使用/改变obs我在 data.table 中创建的列,但返回错误

Error in eval(jsub, SDenv, parent.frame()) : object 'obs' not found

请参阅示例数据的实现。

library(data.table)

set.seed(0)

dt <- data.table(
  index = sample(0:100, 10, replace=FALSE), 
  value = 1:100)

dt[, `:=`(obs = seq_along(index)-1, window = floor(obs/10))] #create an index of every observation and bin them
Run Code Online (Sandbox Code Playgroud)

r data.table

3
推荐指数
2
解决办法
86
查看次数

计算 R 中两两连续数字的平均值

我有一个数据集,其中每年都有一些基于特定年份的列中的数据。

    result_birth <- tibble::tibble( "1970" =c(8.816455, 21.41139,39.0443,51.639236, 59.196197,      100.759485, 76.829107,103.278472,79.348094,99.499991, 81.867081, 78.088601), 
                      "1971"=  c(18.878066 ,30.204906 ,42.790284 ,65.443964 ,69.219577 ,80.546417   ,114.526936 ,94.390332 ,108.234248 ,83.063492 ,103.200096 ,72.99519 ), 
                      "1972"=  c(8.801375 ,22.632107 ,36.462839 ,56.580268 ,69.153661 ,76.697696 ,80.469714 ,109.388518 ,96.815125 ,108.131179 ,69.153661 ,91.785768 ), 
                      "1973"= c(14.675905 ,20.790865 ,31.797794 ,64.818581 ,58.70362 ,86.832438 ,85.609446 ,96.616375 ,97.839367 ,78.271493 ,105.177319 ,53.811652 ))
   
     
     
Run Code Online (Sandbox Code Playgroud)

我想要从数据框的底部获取两两数据的平均值。最后的 rwos 必须与原始数据集相同。例如,对于第一行,我们将有这样的内容:

旧数据和新数据

我写了一些代码来做到这一点,但是这段代码有两个问题:首先,它从上面开始;因此,第一行必须与旧数据相同,(我想要相反,最后一行与旧数据相同)。其次,这些代码非常繁琐,我需要一些更加用户友好的东西。

nrows <- nrow(result_birth)

total_birth <- data.frame(matrix(NA, nrow = nrows, ncol = 
ncol(result_birth)))

for (i in 1:ncol(result_birth)) {
    for (j in 2:nrows) { …
Run Code Online (Sandbox Code Playgroud)

loops r dplyr

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

查找每行的最后一个非缺失值

我有一个数据框,其中包含在时间点 0 到 2 测量的变量var。如下所示:

df <- data.frame(id= letters[1:5],
                 var0= c(1:3, NA, 5),
                 var1= c(11, NA, NA, 14:15),
                 var2= c(NA, NA, NA, NA, 25))
df
  id var0 var1 var2
1  a    1   11   NA
2  b    2   NA   NA
3  c    3   NA   NA
4  d   NA   14   NA
5  e    5   15   25
Run Code Online (Sandbox Code Playgroud)

对于每一行,即对于每个人,我想保留最新的非缺失值。所以期望的输出是:

  id var0 var1 var2 last_val
1  a    1   11   NA       11
2  b    2   NA   NA        2
3  c    3   NA   NA        3 …
Run Code Online (Sandbox Code Playgroud)

r dplyr rowwise

3
推荐指数
2
解决办法
119
查看次数

在 R 中查找时间序列峰值的开始和结束

我正在处理NDVI Time-Series一年内有 23 个观察值的数据。我能够检测到 14 - 19 次观察之间出现的峰值。现在我想找到山顶的起点和终点。我可以通过使用“diff()”查找符号变化来找到峰值的开始和结束。但在某些情况下,我注意到能够找到终点,因为高峰期的终点是在明年。解决方案是在 23 次观察后重复这些值,使其循环并找到终点。

下面给出的例子将详细说明问题

x = c(250.7943,292.2904,340.459,368.811,363.4534,330.2302,291.6527,275.2815,299.9305,367.0331,461.2618,559.0772,639.6197,691.723,713.9833,709.5409,680.4415,626.1153,547.0395,450.4623,353.0839,277.257,241.597)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

我正在寻找从峰值到两个方向的符号变化,并且能够在 8 个观察点找到峰值的起点,但是当我寻找从峰值开始的终点时,我直到 23 号才发现任何变化。在这种情况下,我应该在 23 处得到峰值。如表所示,我已在 Excel 中手动重复这些值以获得符号更改。

在 R 中如何做到这一点???

一种解决方案可能是设置一个条件来检查是否在第 23 个观察之前未发现符号变化,然后将所有 23 个值填充到向量的末尾,然后查找符号变化。

有没有一种简单的方法可以实现这一点???

r time-series

2
推荐指数
1
解决办法
3398
查看次数

删除多面条形图中条形之间的空白

在此输入图像描述

我有一个这样的情节,由以下内容组成:

plot = ggplot(dat, aes(x=Nest)) + geom_bar(aes(fill=MotherID), position = position_stack(reverse = TRUE)) + facet_wrap(~Year) + scale_fill_grey(start = 0, end = .9) + theme(axis.text.x = element_text(angle = 90, hjust = 1)) + theme(legend.position="none") + ylab("Number of offpsring")
Run Code Online (Sandbox Code Playgroud)

我希望所有的条形都彼此相邻,并且在 x 轴上的 3、4、9 处没有间隙。我想这是因为 Nest 是一个数字而不是一个字符串。

我有dat$nest = as.factor(dat$nest)

r ggplot2

2
推荐指数
1
解决办法
1609
查看次数

使用 dplyr 根据另一列中的值添加新列

我有一列数据框df$c_touch

c_touch
0
1
3
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

其中每个数字指的是一段时间,使得0 = 2 mins, 1 = 5 mins, 2 = 10 mins, 3=15 mins, 4=20 mins, 5=30 mins.

我想添加另一列,df$c_duration就像

c_touch c_duration
0 2
1 5
3 15
2 10
3 15
4 20
5 30
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直在使用循环,这有点丑陋/混乱,我宁愿不使用它。是否有一种无循环的方法来添加额外的列,特别是使用 dplyr mutate 函数(因为我正在尝试使用 dplyr 重写所有代码)?

r dplyr

2
推荐指数
1
解决办法
8980
查看次数

ggplot 中的空等高线图

我正在尝试创建一个简单的等高线图。

下面附有示例代码。输出是一个带有标签和警告消息的空图 -

1: stat_contour(): Zero contours were generated 
2: In min(x) : no non-missing arguments to min; returning Inf
3: In max(x) : no non-missing arguments to max; returning -Inf
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决它吗?

library(tidyverse)

# x and y are generated from uniform random distribution
x <- runif(1000, min = -5, max = 5)
y <- runif(1000, min = -5, max = 5)
z <- x^2 + y^2

tbl <- tibble(x, y, z)

ggplot(data = tbl,
       aes(x = x,
           y = y, …
Run Code Online (Sandbox Code Playgroud)

r ggplot2

2
推荐指数
1
解决办法
1438
查看次数

使用 dplyr 对除某些列之外的所有列进行变异

我发现这across()对于在多个列上重复操作非常有用。但是,我仍然没有完全理解如何选择特定列进行操作。

假设我想将函数应用于mtcars、和之外 的所有列。gearcarb

我尝试过类似的东西

# Function to use over columns
demean <- function(x) {
  x - mean(x, na.rm = TRUE)
}

# Use function on all but columns gear and carb
mtcars %>% mutate(across(.cols = select(.,-gear,-carb), demean))
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误

Error: Problem with `mutate()` input `..1`.
x Must subset columns with a valid subscript vector.
x Subscript has the wrong type `data.frame<
Run Code Online (Sandbox Code Playgroud)

取消选择某些列的正确方法是什么across

r dplyr across

2
推荐指数
1
解决办法
2391
查看次数

标签 统计

r ×10

dplyr ×6

ggplot2 ×2

across ×1

data.table ×1

loops ×1

rename ×1

rowwise ×1

time-series ×1