标签: rowwise

检查 R 中的列集是否相同(按行顺序)

我正在 R 工作,如果可能的话,我更喜欢 dplyr 解决方案。

样本数据:

data.frame(
  col1 = c("a", "b", "c", "d"),
  col2 = c("a", "b", "d", "a"),
  col3 = rep("a", 4L),
  col4 = c("a", "b", "d", "a"),
  col5 = c("a", "a", "c", "d"),
  col6 = rep(c("b", "a"), each = 2L)
)
Run Code Online (Sandbox Code Playgroud)
第 1 列 列2 第 3 列 第 4 列 第5栏 第 6 栏
A A A A A
A A
C d A d C A
d A A A d …

r dplyr rowwise

16
推荐指数
8
解决办法
994
查看次数

行方式操作,选择助手和dplyr中的mutate函数

我将使用以下数据集来说明我的问题:

my_df <- data.frame(
    a = 1:10,
    b = 10:1
)
colnames(my_df) <- c("a", "b")
Run Code Online (Sandbox Code Playgroud)

第1部分

我使用该mutate()函数在我的数据集中创建两个新变量,我想计算同一mutate()调用中两个新列的行方式.但是,我真的希望能够使用select()帮助器,如starts_with(),ends_with()contains().

我的第一次尝试:

 my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2,
        mean = rowMeans(select(ends_with("2")))
    )
Error in mutate_impl(.data, dots) : 
  Evaluation error: No tidyselect variables were registered.
Run Code Online (Sandbox Code Playgroud)

我理解为什么会出现错误 - select()函数没有给出任何.data参数.所以我改变了代码......

...我.select()函数内添加" "的第二次尝试:

my_df %>%
    mutate(
        a_2 = a^2,
        b_2 = b^2,
        mean = rowMeans(select(., ends_with("2"))) …
Run Code Online (Sandbox Code Playgroud)

select r dplyr mutate rowwise

6
推荐指数
1
解决办法
523
查看次数

组合:rowwise()、mutate()、cross(),用于多种功能

这在某种程度上与此相关的问题:原则上我试着去了解如何rowwise操作与mutate多个列采用更然后像(1个功能mean()sum()min()等)的工作。

我已经了解到可以across完成这项工作而不是c_across。我已经学会了该功能mean()是将不同的功能min()以如下方式mean()不起作用在dataframes,我们需要将其更改到可以不公开或as.matrix做载体- >从Ronak沙阿了解到这里了解横行()和 c_across()

现在以我的实际情况为例:我能够完成这项任务,但我丢失了一个 column d。我怎样才能避免d这种设置中的柱子松动。

我的 df:

df <- structure(list(a = 1:5, b = 6:10, c = 11:15, d = c("a", "b", 
"c", "d", "e"), e = 1:5), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

不工作:

df %>% 
  rowwise() %>% 
  mutate(across(a:e), 
         avg = mean(unlist(cur_data()), na.rm = TRUE),
         min = …
Run Code Online (Sandbox Code Playgroud)

r dplyr rowwise across

6
推荐指数
2
解决办法
170
查看次数

openxlsx::writeFormula rowwise - 有没有有效的方法来做到这一点?

openxlsx编写公式的函数似乎仅按列添加公式。

有没有一种有效的方法来按行编写公式?

通过一个可重现的示例来说明该问题:

df <- data.frame(a = 1:3,
                 b = 4:6,
                 c = 7:9)

# create workbook, worksheet and write data to worksheet
wb <- createWorkbook()
addWorksheet(wb, "Sheet 1")
writeData(wb, "Sheet 1", x = df)

#  formula to be added rowwise to cells A5:C5
f <- c("SUM(A2:A4)", "SUM(B2:B4)", "SUM(C2:C4)")

# Using the openxlsx function results in columnwise addition of the formula vector: 
writeFormula(wb, sheet = 1, x = f, startCol = 1, startRow = 5)

saveWorkbook(wb, "rowwise_writeFormula.xlsx", overwrite = …
Run Code Online (Sandbox Code Playgroud)

r formula rowwise openxlsx

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

使用 pmap 迭代 tibble 的行

我有一个非常简单的 tibble,我想迭代它的行以使用 function 来应用函数pmap。我想我可能误解了pmap函数上的一些观点,但我大多很难选择参数。所以我想知道rowwise在这种情况下我是否应该使用函数pmap。不过我还没见过案例。另一个问题是选择要使用列表或select函数进行迭代的变量:

# Here is my tibble
# Imagine I would like to apply a `n_distinct` function with pmap on it every rows

df <-  tibble(id = c("01", "02", "03","04","05","06"),
                  A = c("Jan", "Mar", "Jan","Jan","Jan","Mar"),
                  B = c("Feb", "Mar", "Jan","Jan","Mar","Mar"),
                  C = c("Feb", "Mar", "Feb","Jan","Feb","Feb")
)

# It is perfectly achievable with `rowwise` and `mutate` and results in my desired output

df %>%
  rowwise() %>%
  mutate(overal = n_distinct(c_across(A:C))) …
Run Code Online (Sandbox Code Playgroud)

r dplyr purrr rowwise

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

R data.table 逐行操作的首选性能过程?

以下代码是否表示遍历 R 的行data.table并将在每一行找到的值传递给函数的首选过程?或者有没有更高效的方法来做到这一点?

library(data.table)
set.seed(2)
n <- 100
b <- c(0.5, 1.5, -1)
phi <- 0.8
X <- cbind(1, matrix(rnorm(n*2, 0, 1), ncol = 2))
y <- X %*% matrix(b, ncol = 1) + rnorm(n, 0, phi)
d <- data.table(y, X)
setnames(d, c("y", "x0", "x1", "x2"))

logpost <- function(d, b1, b2, b3, phi, mub = 1, taub = 10, a = 0.5, z = 0.7){
    N <- nrow(d)
    mu <- b1 + b2 * d$x1 + b3 * …
Run Code Online (Sandbox Code Playgroud)

performance r data.table rowwise

5
推荐指数
2
解决办法
155
查看次数

查找数组中大于 R 中另一列的最小值

我需要找到三列中大于另一列中的值的最小值。假设这五个人在一年中的不同月份入院,他们在住院前后曾多次心脏病发作。我需要住院后第一次心脏病发作。


id<-c(100,105,108,200,205)
hosp<-c(3,5,2,6,2)
attack1<-c(1,6,3,4,1)
attack2<-c(4,7,9,10,NA)
attack3<-c(5,10,NA,NA,NA)
out<-c(7,12,11,12,9)

data <- data.frame(id,hosp,attack1,attack2,attack3,out)

   id hosp attack1 attack2 attack3 out
1 100    3       1       4       5   7
2 105    5       6       7      10  12
3 108    2       3       9      NA  11
4 200    6       4      10      NA  12
5 205    2       1      NA      NA   9
Run Code Online (Sandbox Code Playgroud)

所以数据最终应该看起来像这样

   id hosp attack1 attack2 attack3 out afterh
1 100    3       1       4       5   7      4
2 105    5       6       7      10  12      6
3 108    2       3       9 …
Run Code Online (Sandbox Code Playgroud)

r rowwise

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

如何使用 rowwise 进行并行处理

我用来rowwise在每一行上执行一个函数。这需要很长时间。为了加快速度,有没有办法使用并行处理,以便多个核心同时处理不同的行?

例如,我将 PRISM 天气数据 ( https://prism.oregonstate.edu/ ) 聚合到州一级,同时按人口进行加权。这是基于https://www.patrickbaylis.com/blog/2021-08-15-pop-weighted-weather/

请注意,下面的代码需要下载每日天气数据以及具有非常小的地理区域人口估计值的 shapefile。

library(prism)
library(tidyverse) 
library(sf)
library(exactextractr)
library(tigris)
library(terra)
library(raster)
library(ggthemes)

################################################################################
#get daily PRISM data
prism_set_dl_dir("/prism/daily/")
get_prism_dailys(type = "tmean", minDate = "2012-01-01", maxDate = "2021-07-31", keepZip=FALSE) 

Get states shape file and limit to lower 48    
states = tigris::states(cb = TRUE, resolution = "20m") %>%
    filter(!NAME %in% c("Alaska", "Hawaii", "Puerto Rico"))

setwd("/prism/daily")

################################################################################
#get list of files in the directory, and extract date
##see if it is stable (TRUE) …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r multiprocessing tidyverse rowwise

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

处理行操作中丢失的数据

ID <- 1:6
math <- c("YES","NO","YES","NO",NA,NA)
history <- c(NA,NA,"NO","NO","YES",NA)

dt <- data.frame(ID, math, history)

  ID math history
1  1  YES    <NA>
2  2   NO    <NA>
3  3  YES      NO
4  4   NO      NO
5  5 <NA>     YES
6  6 <NA>    <NA>
Run Code Online (Sandbox Code Playgroud)

我想添加一个附加列(“pass”),如下所示

  1. 如果学生至少说过一次“是”:“是”(无论其他科目是否缺少数据等等。)

  2. 如果学生没有回答“是”

    • 如果两个受试者都缺少数据:NA
    • 如果其中一个科目为“否”:“否”

所以,列会像这样:(我可以使用这个最小的示例手动执行此操作,但不能使用我的真实数据)

> dt
  ID math history pass
1  1  YES    <NA>  YES
2  2   NO    <NA>   NO
3  3  YES      NO  YES
4  4   NO      NO   NO
5  5 <NA>     YES  YES
6  6 …
Run Code Online (Sandbox Code Playgroud)

row r rowsum rowwise

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

data.table 样本,概率存储在列中

我有一个数据表,其中存储在列中的离散分布的概率。

例如,dt <- data.table(p1 = c(0.5, 0.25, 0.1), p2 = c(0.25, 0.5, 0.1), p3 = c(0.25, 0.25, 0.8))

我想创建一个新的随机变量列,使用同一行中的概率进行采样。在 data.table 语法中,我想象它的工作方式如下:

dt[, sample := sample(1:3, 1, prob = c(p1, p2, p3))]
Run Code Online (Sandbox Code Playgroud)

如果有一个类似于“pmin”和“pmax”的“psample”函数,那么这将起作用。我能够使用 apply 来完成这项工作,缺点是对于我的真实数据集,这需要比我想要的更长的时间。有没有办法使用 data.table 来完成这项工作?下面给出应用解决方案。

dt[, sample := apply(dt, 1, function(x) sample(1:3, 1, prob = x[c('p1', 'p2', 'p3')]))]
Run Code Online (Sandbox Code Playgroud)

random r function data.table rowwise

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