質問は少し一般的に聞こえますが、例ははるかに明確になると思います。
私は次の2つのデータフレームを持っています
data1
group1 group2 group3 Level
cat cat dog 1
dog parrot cat 1
mouse dolphin dolphin 1
red blue blue 2
green yellow green 2
black purple cat 2
data2
var1 level Score
cat 1 1
dog 1 1
mouse 1 1
dolphin 1 0
parrot 1 1
red 2 1
blue 2 1
green 2 1
purple 2 1
cat 2 0
black 2 0
yellow 2 1
3つの新しい列(group1、group2、group3ごとに1つ)を組み込んだdata1を、「level」のレベルに応じてdata2の「score」列にある値で変更したいと思います(レベルは係数です)。だから基本的に私はこのようなものを手に入れたいです:
group1 group2 group3 Level var1 var2 var3
cat cat dog 1 1 1 1
dog parrot cat 1 1 1 1
mouse dolphin dolphin 1 1 0 0
red blue blue 2 1 1 1
green yellow green 2 1 1 1
black purple cat 2 0 1 0
サンプルデータ
df1 <- structure(list(
group1 = c("cat", "dog", "mouse", "red", "green", "black"),
group2 = c("cat", "parrot", "dolphin", "blue", "yellow", "purple"),
group3 = c("dog", "cat", "dolphin", "blue", "green", "cat"),
Level = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor")),
row.names = c(NA, -6L), class = "data.frame")
df2 <- structure(list(
var1 = c("cat", "dog", "mouse", "dolphin", "parrot", "red", "blue", "green", "purple", "cat", "black", "yellow"),
level = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"),
Score = c(1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L)),
row.names = c(NA, -12L), class = "data.frame")
最初のデータセットを「長い」形式にピボットし、2番目のデータセットと結合してから、「広い」形式に戻すことができます。
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -c(rn, Level), values_to = 'var1') %>%
rename(level = Level) %>%
left_join(df2) %>%
mutate(name = str_replace(name, 'group', 'varn')) %>%
na.omit %>%
select(-level, -var1) %>%
pivot_wider(names_from = name, values_from = Score, values_fill = list(Score = 0)) %>%
select(-rn) %>%
bind_cols(df1, .)
# group1 group2 group3 Level varn1 varn2 varn3
#1 cat cat dog 1 1 1 1
#2 dog parrot cat 1 1 0 1
#3 mouse dolphin dolphin 1 1 0 0
#4 red blue blue 2 1 1 1
#5 green yellow green 2 1 0 1
#6 black purple cat 2 0 1 0
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加