根据先前变量的值重命名变量

时间:2019-01-13 19:02:13

标签: r dplyr data.table

我有以下数据框。

V1 <- c(2, 2, 2)
V2 <- c(12, 13, 24)
V3 <- c(3, 3, 3)
V4 <- c(1, 23, 33)
data <- data.frame(V1, V2, V3, V4)

data
  V1 V2 V3 V4
1  2 12  3  1
2  2 13  3 23
3  2 24  3 33

我想根据V1中的值重命名V1。这意味着,我想将变量V2重命名为Var_2,其中数字2来自V1

  Var_2 Var_3
1    12     1
2    13    23
3    24    33

有什么简单的方法吗?我想复制500个变量的过程。有什么办法避免循环吗?

3 个答案:

答案 0 :(得分:1)

也许我没有收到您的问题,但是只要您只需要数据第一行中的名称,类似的东西就应该起作用:

names(data) <- paste("Var",data[1,][1:ncol(data)],sep="_")

> names(data)
[1] "Var_2"  "Var_12" "Var_3"  "Var_1" 

答案 1 :(得分:1)

这里有tidyverse的可能性:

data %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 arrange(rowid) %>%
 mutate(temp = ifelse(parse_number(var) %% 2 == 0, 1, NA),
        var2 = ifelse(temp == 1 & is.na(lag(temp, default = 0)), 
                      paste("Var", lag(val), sep = "_"), NA)) %>%
 na.omit() %>%
 select(-var, -temp) %>%
 spread(var2, val) %>%
 select(-rowid)

  Var_2 Var_3
1    12     1
2    13    23
3    24    33

首先,它生成一个唯一的行ID。其次,它将数据从宽格式转换为长格式。第三,它检查列名是否由偶数组成。如果是这样,它将分配1,否则分配NA。然后,如果它是偶数而滞后时间是NA,则它将“ Var”和滞后列中的值组合在一起。最后,它将删除NA值,然后将其返回为宽格式。

答案 2 :(得分:1)

data.table方法:对于500个变量,您必须设计删除这些变量的方法,如此处所示。此外,假设所有列的值都相同,即3333,2222,依此类推。

data <- data.frame(V1, V2, V3, V4)
library(data.table)
setDT(data)
data1<-data[,list(V1,V3)]
#data1[,lapply(.SD,unique)]
data[,`:=`(V1=NULL,V3=NULL)]
names(data)<-do.call("paste",list("Var_",unique(data1)))
data


    Var_ 2    Var_ 3
1:     12      1
2:     13     23
3:     24     33