R编程:根据条件提取上一列值

时间:2016-10-19 21:27:50

标签: r

数据框如下。我有一个包含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

希望这能澄清我的问题。

2 个答案:

答案 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)