我有以下数据框。
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个变量的过程。有什么办法避免循环吗?
答案 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