Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中另一个数据帧的值在数据帧中创建新变量_R - Fatal编程技术网

使用R中另一个数据帧的值在数据帧中创建新变量

使用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和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','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