使用R中另一个数据帧的值在数据帧中创建新变量
我有两个数据集df和df1使用R中另一个数据帧的值在数据帧中创建新变量,r,R,我有两个数据集df和df1 df = data.frame(Name = c('A','B','C'), Filter = c('D','E','F'), Sub_A = c(6,7,8), Sub_B = c(9,10,11)) df1 = data.frame(Name = c('A','A','A','A','B','B','B','B','C','C','C','C','P','P','P'
df = data.frame(Name = c('A','B','C'),
Filter = c('D','E','F'),
Sub_A = c(6,7,8),
Sub_B = c(9,10,11))
df1 = data.frame(Name = c('A','A','A','A','B','B','B','B','C','C','C','C','P','P','P','P'),
Filter = c('D','D','D','X','E','E','E','X','F','F','F','X','Y','Y','Y','Y'),
Subject = c('Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B','Sub_A','Sub_B'),
Marks = c(10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25))
使用针对df数据集中名称的过滤器,我想首先过滤df1数据集中的名称,并使用针对df数据集中的Sub_A和Sub_B的值,通过在df1数据集中创建一个新变量Corrected_marks来纠正df1数据集中的Sub_A和Sub_B的标记
输出数据集应该是
Ouput = data.frame(Name = c('A','A','A','B','B','B','C','C','C'),
Filter = c('D','D','D','E','E','E','F','F','F'),
Subject = c('Sub_A','Sub_B','Sub_A','Sub_A','Sub_B','Sub_A','Sub_A','Sub_B','Sub_A'),
Marks = c(10,11,12,14,15,16,18,19,20),
Corrected_Marks = c(6.2,10.23,7.44,8.12,13.95,9.28,10.152,17.67,11.28))
计算不清楚。也许我们可以在将第一个数据重塑为“long”格式后进行连接,然后再进行计算
library(dplyr)
library(tidyr) # >= 1.0.0
df %>%
pivot_longer(cols = Sub_A:Sub_B, names_to = "Subject",
values_to = "Corrected_Marks") %>%
# for tidyr < 1.0.0
# gather(Subject, Corrected_Marks, Sub_A:Sub_B) %>%
inner_join(df1, by = c("Name", "Filter", "Subject")) %>%
mutate(Corrected_Marks = Marks * Corrected_Marks)
# A tibble: 9 x 5
# Name Filter Subject Corrected_Marks Marks
# <chr> <chr> <chr> <dbl> <dbl>
#1 A D Sub_A 60 10
#2 A D Sub_A 72 12
#3 A D Sub_B 99 11
#4 B E Sub_A 98 14
#5 B E Sub_A 112 16
#6 B E Sub_B 150 15
#7 C F Sub_A 144 18
#8 C F Sub_A 160 20
#9 C F Sub_B 209 19
库(dplyr)
图书馆(三年)#>=1.0.0
df%>%
pivot_longer(cols=Sub_A:Sub_B,names_to=“Subject”,
值到=“更正的标记”)%>%
#对于tidyr<1.0.0
#聚集(主题、已更正的分数、子项A:子项B)%>%
内部联接(df1,by=c(“名称”、“筛选器”、“主题”))%>%
变异(更正的标记=标记*更正的标记)
#一个tibble:9x5
#名称筛选器主题已更正\u标记
#
#1 A D Sub_A 60 10
#2 A D Sub_A 72 12
#3 A D Sub_B 99 11
#4 B E Sub_A 98 14
#5 B E Sub_A 112 16
#6 B E Sub_B 150 15
#7 C F Sub_A 144 18
#8 C F Sub_A 160 20
#9 C F Sub_B 209 19
除了by的解决方案之外,这里还有另一个带有base R
的解决方案,因此运行下面的代码不需要更多的包:
dfm <- merge(df,df1)
Ouput <- cbind(dfm[names(df1)],
Corrected_Marks = apply(dfm, 1, function(x) as.numeric(x["Marks"])*as.numeric(x[x["Subject"]])))
请注意,
输出
中的主题
列和标记
列的元素顺序与df1
中的相同,这与通过得到的解决方案不同。您能否显示“输出”中显示的修正标记的计算结果?如何获得修正标记中的值?有计算示例吗?如果df中的筛选器变量中存在筛选器,则如何获得.62
,因为值与df
或df1
不匹配。抱歉,类型错误更正的标记在df1中计算为每个名称的倍增标记。例如,对于df1中的第一行,它将是10*6=60Sir,得到一个错误“找不到函数”pivot_longer“。好心的help@AmanSaddi请检查您的packageVersion('tidyr')
它应该是1.0.0
唯一的问题是我无法更新tidyr软件包,但我收到了您的logic@AmanSaddi在这种情况下,将pivot\u longer
替换为collect(主题、已更正的标记、Sub\u A:Sub\u B)
Name Filter Subject Marks Corrected_Marks
1 A D Sub_A 10 60
2 A D Sub_B 11 99
3 A D Sub_A 12 72
4 B E Sub_A 14 98
5 B E Sub_B 15 150
6 B E Sub_A 16 112
7 C F Sub_A 18 144
8 C F Sub_B 19 209
9 C F Sub_A 20 160