我是R的新手,感谢您在以下问题上的帮助:
我有一段代码遍历名为m的数据集的一列中的所有值(x),并通过for循环将它们与固定值一一比较。我希望仅当m [(SAME ROW AS x),“ reference_column_name”]中的单元格包含某个字符串时,才将x与固定值(0.17)进行比较。
目标是在m的末尾获得x值与基于x的行与x相同的引用列中的单元格进行比较的值0、1、2或3的列。像这样:
new_column
0
2
2
3
1
1
2
0
3
如何引用x的行(随着for循环的继续,变量不断变化)? 我可以用什么替换“(SAME ROW AS x)”?
这是我的代码:
m$new_colum <- 0 #I start by assigning everything the value 0.
for (x in m$current_column) {
if ((grepl("string",((m[(SAME ROW AS x),"reference_column_name"])),fixed=TRUE))==TRUE){
if (is.na(x)){
m$new_column<-0
}
else if (x <= 0.17) {
m$new_column<-1}
else if (x > 0.17) {
m$new_column<-2}
}
else {m$new_column<-3}
}
我更改了所有变量和列名称,以使阅读此问题更加容易-我知道名称应该更短。
感谢您的帮助!
答案 0 :(得分:0)
也许这不是您真正想要的,但看起来像那样。
创建一些示例数据:
df <- data.frame(c(NA, -10:88),
rep(c("a", "b", "c", "d", "e"), 20),
stringsAsFactors = FALSE)
固定值为“ 1”,固定字符串为“ a”:
new_col <- ifelse(is.na(df[,1]) == TRUE & df[,2] == "a", 0,
ifelse(df[,1] == 1 & df[,2] == "a", 1,
ifelse(df[,1] < 1 & df[,2] == "a", 2,
ifelse(df[,1] > 1 & df[,2] == "a", 3, 99))))
> new_col
[1] 0 99 99 99 99 2 99 99 99 99 2 99 99 99 99 3 99 99 99 99 3 99
[23] 99 99 99 3 99 99 99 99 3 99 99 99 99 3 99 99 99 99 3 99 99 99
[45] 99 3 99 99 99 99 3 99 99 99 99 3 99 99 99 99 3 99 99 99 99 3
[67] 99 99 99 99 3 99 99 99 99 3 99 99 99 99 3 99 99 99 99 3 99 99
[89] 99 99 3 99 99 99 99 3 99 99 99 99
答案 1 :(得分:0)
据我对您问题的理解,这是我的解决方案:
m$new_column <- ifelse(grepl("string", m$ref_column), ifelse(is.na(m$x), 0, ifelse(m$x <= 0.17, 1, 2)), 3)
此代码将首先检查同一行的参考列中的字符串。如果找不到,它将等于3。如果找到,它将进一步进入第二个ifelse
块。
-在此块中,它将首先检查NA
并分配一个0,否则它将进入第三个ifelse
块,在此最后检查“ x”列的值是否等于或小于0.17并分配其他2个。
希望这会有所帮助
答案 2 :(得分:0)
可以使用一系列正确索引的分配:
dat <- data.frame( x=runif(20), ref_col=sample( c("string", "not string"), 20, repl=TRUE) )
dat$new_col[dat$x > 0.17 & dat$ref_col=="string"] <- 2
dat$new_col[dat$x <= 0.17 & dat$ref_col=="string"] <- 1
dat$new_col[ is.na(dat$x)] <- 0
dat$new_col[ dat$ref_col != "string"] <- 3
dat
我的x中没有NA,但我预计它们会被正确分配