我正在 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 … |
我将使用以下数据集来说明我的问题:
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) 这在某种程度上与此相关的问题:原则上我试着去了解如何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) 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) 我有一个非常简单的 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 的行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) 我需要找到三列中大于另一列中的值的最小值。假设这五个人在一年中的不同月份入院,他们在住院前后曾多次心脏病发作。我需要住院后第一次心脏病发作。
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) 我用来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) 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”),如下所示
如果学生至少说过一次“是”:“是”(无论其他科目是否缺少数据等等。)
如果学生没有回答“是”
所以,列会像这样:(我可以使用这个最小的示例手动执行此操作,但不能使用我的真实数据)
> 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) 我有一个数据表,其中存储在列中的离散分布的概率。
例如,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)