R:遍历列,从列中选择值并将其写入同一行中的新列
我有以下格式的数据帧R:遍历列,从列中选择值并将其写入同一行中的新列,r,loops,dataframe,R,Loops,Dataframe,我有以下格式的数据帧 id var1 val1 status1 var2 val2 status2 var3 val3 status3 123 a 12 false b 23 true c 34 true 在这里,我想遍历每一行的每一列,获取变量的第一个status true,并将其保存到新行。下面是上述示例的预期输出 有没有一种方法可以在不使用2 for循环的情况下执行此操作。(循环中的循环) 在我看来,处理长格式的数据会更容易。因
id var1 val1 status1 var2 val2 status2 var3 val3 status3
123 a 12 false b 23 true c 34 true
在这里,我想遍历每一行的每一列,获取变量的第一个status true,并将其保存到新行。下面是上述示例的预期输出
有没有一种方法可以在不使用2 for循环的情况下执行此操作。(循环中的循环)
在我看来,处理长格式的数据会更容易。因此,首先是从宽到长进行重塑
dat_long <- reshape(dat, idvar = "id", varying = 2:ncol(dat), direction = "long", sep = "")
结果
dat_long
# id time var val status firstOccured
#123.1 123 1 a 12 false b
#123.2 123 2 b 23 true b
#123.3 123 3 c 34 true b
如果我们需要回到广域格式,我们可以这样做
out <- reshape(dat_long, idvar = "id", timevar = "time", direction = "wide", sep = "")
out <- out[setdiff(names(out), c("firstOccured1", "firstOccured2"))]
out
# id var1 val1 status1 var2 val2 status2 var3 val3 status3 firstOccured3
#123.1 123 a 12 false b 23 true c 34 true b
out
dat_long
# id time var val status firstOccured
#123.1 123 1 a 12 false b
#123.2 123 2 b 23 true b
#123.3 123 3 c 34 true b
out <- reshape(dat_long, idvar = "id", timevar = "time", direction = "wide", sep = "")
out <- out[setdiff(names(out), c("firstOccured1", "firstOccured2"))]
out
# id var1 val1 status1 var2 val2 status2 var3 val3 status3 firstOccured3
#123.1 123 a 12 false b 23 true c 34 true b
dat <- structure(list(id = 123L, var1 = "a", val1 = 12L, status1 = "false",
var2 = "b", val2 = 23L, status2 = "true", var3 = "c", val3 = 34L,
status3 = "true"), .Names = c("id", "var1", "val1", "status1",
"var2", "val2", "status2", "var3", "val3", "status3"), class = "data.frame", row.names = c(NA,
-1L))