数据框如下。我有一个包含50多个变量的数据集,所有变量都标记为Var_1 .. Var_50。 50个变量中的一个具有国家代码(英国或美国)。数据框的结构使得如果var_5 =" UK",则var_4始终包含商店编号。
我想写的代码是 - 如果var_5 = UK,则country =" var_5"和store =" var_4"。如果我可以设置一个循环,所以我不必复制粘贴这50次就会很棒!
ID Brand Var_1 Var_2 Var_3 Var_4 Var_5
1 Soaps Supervisor Quantity StoreK UK Owner
2 Shampoo StoreZ US
3 Oil Material StoreY UK Supplier
我想要的是数据框下面
ID Brand Var_1 Var_2 Var_3 Var_4 Country StoreID
1 Soaps Supervisor Quantity StoreK UK UK StoreK
2 Shampoo StoreZ US US StoreZ
3 Oil Material StoreY UK UK StoreY
希望这能澄清我的问题。
答案 0 :(得分:0)
由于包含国家/地区和商店信息的列已经存在,因此无需创建其他列,只需重命名它们即可。
the.data <- data.frame(Brand = c("Soap", "Oil", "Mail"), var1 = rnorm(3), var2 = c("store_K", "store_xs", "store_k"), var3 = c("UK", "AL", "USA"))
# subset your data frame and select rows that are UK or US
uk.data <- the.data[grep("UK|US", the.data$var3), ]
# rename the columns
colnames(uk.data)[3:4]<- c("Store", "Country")
答案 1 :(得分:0)
你可以尝试:
data <- data.frame(ID = c(1,2,3), Brand = c("Soaps", "Shampoo", "Oil"),
Var_1 = c("Supervisor", "Storez", "Material"),
Var_2 = c("Quantity", "US", "StoreY"),
Var_3 = c("StoreK", "", "UK"),
Var_4 = c("UK", "", ""))
tmp <- data.frame(t(apply(data, 1, function(x) { pos = grep("UK|US", x)
if (length(pos)) {c(x[pos], x[pos - 1])}
else { c("", "") }
})))
names(tmp) <- c("Country", "Store")
data <- cbind(data, tmp)