R 从一个数据帧到另一个数据帧的数据表操作

R 从一个数据帧到另一个数据帧的数据表操作,r,dataframe,dplyr,data.table,R,Dataframe,Dplyr,Data.table,我有“dataHAVE”并试图生成“dataWANT”。规则如下: 如果f1和c1=0,则w1=0 如果f1=1,c1=0,则w1=1 如果f1=0,c1=1,则w1=2 如果f1=1和c1=1,则w1=2 基本上,我想知道:如何生成这个变量,其次,如何在将新变量放入dataWANT时对dataHAVE执行data.table函数?这是可行的,但由于dataHAVE中有两个重复的列,这有点“脏”。为了解决这个问题,我只需运行命令两次删除原始列…:D 我还将原始的dataHAVE命令更改为创建da

我有“dataHAVE”并试图生成“dataWANT”。规则如下:

如果f1和c1=0,则w1=0

如果f1=1,c1=0,则w1=1

如果f1=0,c1=1,则w1=2

如果f1=1和c1=1,则w1=2


基本上,我想知道:如何生成这个变量,其次,如何在将新变量放入dataWANT时对dataHAVE执行data.table函数?

这是可行的,但由于dataHAVE中有两个重复的列,这有点“脏”。为了解决这个问题,我只需运行命令两次删除原始列…:D

我还将原始的dataHAVE命令更改为创建data.table而不是data.frame,以使用data.table逻辑

这并不十分优雅,但至少它是有效的。剩下的只是在删除旧列之前创建逻辑规则,我只是将您在答案中列出的规则包括在内

希望这有帮助

编辑:使用列名和with=FALSE提取dataWANT的新版本。更干净:)

库(data.table)
dataHAVE=data.table(“学生”=c(1,2,3,4,5),
“f1”=c(0,0,0,1,1),
“c1”=c(1,1,0,1,0),
“f2”=c(1,0,0,1),
“c2”=c(1,0,0,1,0),
“f3”=c(0,0,0,1,1),
“c4”=c(1,1,0,1,0),
“f4”=c(1,0,0,1),
“c4”=c(NA,0,0,1,0))

旧列我们可以使用
pivot\u longer/pivot\u wide

library(data.table)
dataHAVE=data.table("student"=c(1,2,3,4,5),
                    "f1"=c(0,0,0,1,1),
                    "c1"=c(1,1,0,1,0),
                    "f2"=c(1,0,0,0,1),
                    "c2"=c(1,0,0,1,0),
                    "f3"=c(0,0,0,1,1),
                    "c4"=c(1,1,0,1,0),
                    "f4"=c(1,0,0,0,1),
                    "c4"=c(NA,0,0,1,0))

old_columns <- colnames(dataHAVE)[2:ncol(dataHAVE)]

dataHAVE[f1 == 0 & c1 == 0, 'w1' := 0]
dataHAVE[f1 == 1 & c1 == 0, 'w1' := 1]
dataHAVE[f1 == 0 & c1 == 1, 'w1' := 2]
dataHAVE[f1 == 1 & c1 == 1, 'w1' := 2]

keep_columns <- setdiff(colnames(dataHAVE), old_columns)

dataWANT <- dataHAVE[, keep_columns, with = FALSE]

@akrun修复,抱歉,谢谢!!根据您的输入,我在
dataWANT
中发现一些值不匹配logic@akrun非常感谢在这种情况下,请遵循逻辑,而不是我制作的数据集,因为我可能犯了一个错误=)
library(data.table)
dataHAVE=data.table("student"=c(1,2,3,4,5),
                    "f1"=c(0,0,0,1,1),
                    "c1"=c(1,1,0,1,0),
                    "f2"=c(1,0,0,0,1),
                    "c2"=c(1,0,0,1,0),
                    "f3"=c(0,0,0,1,1),
                    "c4"=c(1,1,0,1,0),
                    "f4"=c(1,0,0,0,1),
                    "c4"=c(NA,0,0,1,0))

old_columns <- colnames(dataHAVE)[2:ncol(dataHAVE)]

dataHAVE[f1 == 0 & c1 == 0, 'w1' := 0]
dataHAVE[f1 == 1 & c1 == 0, 'w1' := 1]
dataHAVE[f1 == 0 & c1 == 1, 'w1' := 2]
dataHAVE[f1 == 1 & c1 == 1, 'w1' := 2]

keep_columns <- setdiff(colnames(dataHAVE), old_columns)

dataWANT <- dataHAVE[, keep_columns, with = FALSE]
library(dplyr)
library(tidyr)
library(stringr)
dataHAVE %>%
  pivot_longer(cols = -student, names_to = c(".value", "grp"), 
        names_sep="(?<=[fc])(?=\\d+)") %>% 
  group_by(student, grp= str_c('w', grp)) %>% 
  transmute(w =  case_when(f %in%  0:1 & c == 1 ~ 2, 
            f == 1 & c == 0 ~ 1, TRUE ~ 0)) %>% 
  pivot_wider(names_from = grp, values_from = w)
library(data.table)
dM <- melt(setDT(dataHAVE), measure = patterns("^f", "^c"), 
  value.name = c('f', 'c'))[, w := fcase(f %in% 0:1 & c== ~ 2, 
      f == 1 & c == 0 ~ 1, TRUE ~ 0)]
dcast(dM, student ~ paste0('w', variable), value.var = 'w')