我有长格式数据,其结构如下(当然,多个国家、年份和变量):
df <- tribble(
~ind, ~country, ~year, ~group, ~dummy, ~v1, ~v2,
1, "country 1", 1990, "A", 0, 2.53, 1.68,
2, "country 1", 1990, "B", 0, 2.63, -5.21,
3, "country 1", 1991, "A", 1, 6.54, 3.48,
4, "country 1", 1991, "B", 1, 7.11, 2.52,
5, "country 1", 1992, "A", 0, 2.69, -3.45,
6, "country 1", 1992, "A", 0, 2.49, -3.45,
7, "country 2", 1990, "A", 0, 2.73, 1.68,
8, "country 2", 1990, "B", 0, 2.73, -1.21,
9, "country 2", 1991, "A", …Run Code Online (Sandbox Code Playgroud) 我有 2 个数据框,它们具有相同的列名,但行数不同。第一个数据框 (a) 看起来与此类似:
a = data.frame("Site"=c(1,2,3,4,7,9,10,11,13,14),
"v1"=c(0,0,0,0,0,0,0,0,0,0),
"v2"=c(0,0,0,0,NA,NA,NA,0,0,0),
"v3"=c(0,0,0,NA,0,NA,0,0,0,0),
"v4"=c(0,0,0,0,0,0,0,0,NA,NA),
"v5"=c(0,0,0,0,0,NA,0,NA,0,0))
Run Code Online (Sandbox Code Playgroud)
注意:站点 5、6、8 和 12 故意缺失。
第二个数据框 (b) 看起来像这样:
b = data.frame("Site"=c(2,3,4,7,10,14),
"v1"=c(1,NA,2,1,NA,NA),
"v2"=c(1,1,NA,NA,NA,NA),
"v3"=c(NA,1,NA,NA,NA,1),
"v4"=c(1,NA,4,1,NA,NA),
"v5"=c(1,NA,2,1,1,3))
Run Code Online (Sandbox Code Playgroud)
我想要实现的是:
desired = data.frame("Site"=c(1,2,3,4,7,9,10,11,13,14),
"v1"=c(0,1,0,2,1,0,0,0,0,0),
"v2"=c(0,1,1,0,NA,NA,NA,0,0,0),
"v3"=c(0,0,1,NA,0,NA,0,0,0,1),
"v4"=c(0,1,0,4,1,0,0,0,NA,NA),
"v5"=c(0,1,0,2,1,NA,1,NA,0,3))
Run Code Online (Sandbox Code Playgroud)
我将数据帧 b 中的数据“注入”(我确信有更好的术语)到数据帧 a 中,但是我想用零替换 b 中的任何 NA,并保持 a 中的 NA 原样。
我发现并尝试过这段代码:
cols <- colnames(a)[colnames(a) %in% colnames(b)]
rows <- rownames(a)[rownames(a) %in% rownames(b)]
a[rows, cols] <- b[rows, cols]
Run Code Online (Sandbox Code Playgroud)
但它也带来了 NA。我考虑先用零替换 NA,但即便如此,它也会删除我当前在数据帧 a 中想要保留的 NA。
也许 for 循环或 tidyverse 中的某些东西是可行的方法,但我什至不知道从哪里开始。任何帮助将非常感激!
我在下面有一个数据集,我想在其中对每个国家和州进行线性回归,然后在数据集中绑定预测值:
添加三列后的最终数据框:
我已经为一个国家和一个地区做了,但想为每个国家和地区做,把预测的上下限值放回cbind设置的数据中:
data <- data.frame(country = c("US","US","US","US","US","US","US","US","US","US","UK","UK","UK","UK","UK"),
Area = c("G","G","G","G","G","I","I","I","I","I","A","A","A","A","A"),
week = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),amount = c(12,23,34,32,12,12,34,45,65,45,45,34,23,43,43))
data_1 <- data[(data$country=="US" & data$Area=="G"),]
model <- lm(amount ~ week, data = data_1)
pre <- predict(model,newdata = data_1,interval = "prediction",level = 0.95)
pre
Run Code Online (Sandbox Code Playgroud)
我如何为国家和地区的其他组合循环这个?
我想用来dplyr::coalesce查找包含多对变量的数据框中变量对之间的第一个非缺失值。目标是创建一个新的数据帧,现在每对变量只有一个副本(没有 NA 值的合并变量)。
这是一个例子:
df <- data.frame(
A_1=c(NA, NA, 3, 4, 5),
A_2=c(1, 2, NA, NA, NA),
B_1=c(NA, NA, 13, 14, 15),
B_2=c(11, 12, NA, NA, NA))
Expected output:
A B
1 11
2 12
3 13
4 14
5 15
Run Code Online (Sandbox Code Playgroud)
我猜测可以使用基于正则表达式的混合dplyr::coalesce,dplyr::mutate_at但我不知道该怎么做。有没有办法用 tidyverse 语法来完成这个任务?
谢谢!
编辑:感谢大家的回答!但是,我应该包含变量的命名约定,以便于将您的答案转移到我的实际问题上。对此我感到很抱歉。我的变量是地球化学变量,由两部分命名(化学元素名称加核心名称)。
示例:Al_TAC4.25.275其中Al是元素,TAC4.25.275是核心。我想为每个元素(名称的第一部分)合并来自 3 个不同核心(名称的第二部分)的数据。我有 25 对元素需要合并。
我想使用summarizeand acrossfrom来计算分组变量的dplyr非值数量。NA例如,使用这些数据:
library(tidyverse)
d <- tibble(ID = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
Col1 = c(5, 8, 2, NA, 2, 2, NA, NA, 1),
Col2 = c(NA, 2, 1, NA, NA, NA, 1, NA, NA),
Col3 = c(1, 5, 2, 4, 1, NA, NA, NA, NA))
Run Code Online (Sandbox Code Playgroud)
# A tibble: 9 x 4
ID Col1 Col2 Col3
<dbl> <dbl> <dbl> <dbl>
1 1 5 NA 1
2 1 8 2 5 …Run Code Online (Sandbox Code Playgroud) 我正在处理一个数据框,R其中跨行有一些缺失值。接下来是数据框(最后dput添加):
df
id V1 V2 V3 V4
1 01 1 1 1 NA
2 02 2 1 NA NA
3 03 3 1 NA NA
4 04 4 1 2 NA
Run Code Online (Sandbox Code Playgroud)
每一行都是不同的id。如您所见,行有缺失值。我想知道如何在不使用 reshape to long 或 pivot 的情况下以这种样式完成数据框,因为我的真实数据非常大:
df
id V1 V2 V3 V4
1 01 1 1 1 1
2 02 2 1 1 1
3 03 3 1 1 1
4 04 4 1 2 2
Run Code Online (Sandbox Code Playgroud)
我试图使用fill …
我再次对如何实现这一目标感到困惑:
鉴于此数据框:
df <- tibble(
foo = c(1,0,1),
bar = c(1,1,1),
foobar = c(0,1,1)
)
Run Code Online (Sandbox Code Playgroud)
这个向量:
to_sum <- c("foo", "bar")
Run Code Online (Sandbox Code Playgroud)
我想获得列中值的行式总和to_sum。
期望的输出:
# A tibble: 3 x 4
# Rowwise:
foo bar foobar sum
<dbl> <dbl> <dbl> <dbl>
1 1 1 0 2
2 0 1 1 1
3 1 1 1 2
Run Code Online (Sandbox Code Playgroud)
输入它是有效的(显然)。
df %>% rowwise() %>%
mutate(
sum = sum(foo, bar)
)
Run Code Online (Sandbox Code Playgroud)
这不会:
df %>% rowwise() %>%
mutate(
sum = sum(to_sum)
)
Run Code Online (Sandbox Code Playgroud)
我理解,因为如果我要尝试:
df %>% rowwise() …Run Code Online (Sandbox Code Playgroud) 比方说,我有多个变量衡量物质滥用即A1是alcohal使用, A2是bhang和A3是可卡因。我想生成变量afin如果三者中的任何一个是肯定的,表明参与药物滥用的。
有没有办法缩短代码,所以我不指定使用多个ifelse语句,如下所示?试图找到最好的方法来做到这一点,因为我有 10 多个变量可以合并为一个,而写作ifelse可能并不理想。
# Anymatch
library(tidyverse)
set.seed(2021)
mydata <- tibble(
a1 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
a2 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
a3 = factor(round(runif(20, 1, 3)),
labels = c("Yes", "No", "N/A")),
b1 = round(rnorm(20, 10, 2)))
mydata
mydata <- mydata %>%
mutate(afin = ifelse(a1 == "Yes"|a2=="Yes"|a3=="Yes", "Yes", "No"))
Run Code Online (Sandbox Code Playgroud) 我有一个需要转换的数据框。我需要根据列的值将唯一行更改为单列。
我的数据如下:
df1 <- data.frame(V1 = c("a", "a", "b", "b","b"),
V2 = c("product1", "transport", "product1", "product2","transport"),
V3 = c("100", "10", "100", "100","10"))
> df1
V1 V2 V3
1 a product1 100
2 a transport 10
3 b product1 100
4 b product2 100
5 b transport 10
Run Code Online (Sandbox Code Playgroud)
我需要进行以下转换,并将 V3 的值除以 V1 中包含的产品数量。
> df2
V1 V2 transport V3
1 a product1 10 100
2 b product1 5 100
3 b product2 5 100
Run Code Online (Sandbox Code Playgroud) 如果一个函数有一个参数和椭圆并且两者以相同的字母开头,我会遇到奇怪的行为。一个玩具示例是这个
> testfun=function(aa=0, ...) {print(aa); list(...)}
> testfun(b=1)
[1] 0
$b
[1] 1
> testfun(a=1)
[1] 1
list()
Run Code Online (Sandbox Code Playgroud)
因此,当我调用时testfun(b=1),一切正常,aa打印为 0 并返回元素 b=1 的列表。但是,如果我调用testfun(a=1),aa 现在为 1 并且返回一个空列表。显然,如果有一个参数以与传递给 ... 的字母相同的字母开头,则该参数会发生更改并且...会丢失。
知道这是为什么吗?有什么办法可以避免这种情况吗?在我真正的问题中,...由用户提供,他们可能使用任何名称作为参数(除了那些已经是函数参数的名称,例如这里的 aa )