R中ifelse、which、%in%的用法

本文详细介绍了R语言中ifelse、which、%in%这三个常用函数的功能与用法,并通过实例演示了它们如何帮助进行条件判断、元素匹配及逻辑运算。


R中ifelse、which、%in%的用法

在R学习过程中,遇到了ifelse、which、%in%,下面分别举例,说明他们的用法。
1、ifelse
ifelse(test, yes, no)
test为真,输出yes值,否则输出no值。
举例如下:
> x <- c(1,1,1,0,0,1,1)
> ifelse(x != 1, 1, 0) #若果x的值不等于1,输出1,否则输出0
[1] 0 0 0 1 1 0 0

2、which
用法which(test)。
返回test为真值的位置(指针)。
举例如下:
> which(x!=1) #返回x中不等于1的变量值得位置
[1] 4 5
> which(c(T,F,T)) #返回c(T,F,T)中为TURE值的位置。
[1] 1 3
> which(c(1,0,1)) #只对T, F做判断。
Error in which(c(1, 0, 1)) : argument to 'which' is not logical

3、%in%
用法 a %in% table
a值是否包含于table中,为真输出TURE,否者输出FALSE
例如
> x %in% 1
[1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
> x %in% c(1, 0)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> x %in% c(1, 2)
[1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE


联合使用
> ifelse(x %in% 1, 1, 0) #若x的值包含在1里面,输出1,否者输出0
[1] 1 1 1 0 0 1 1
> ifelse(x %in% 1, 'yes', 'no') #若x的值包含在1里面,输出yes,否者输出no
[1] "yes" "yes" "yes" "no"  "no"  "yes" "yes"
> which(x %in% 1) 输出x包含在1中值的位置
[1] 1 2 3 6 7
> y <- c(2, 1, 3, 4)
> z <- c(1, 4)
> ifelse(y %in% z, which(y==z), 0 ) ##若y的值包含在z里面,输出y==z的位置,否者输出0
[1] 0 2 0 4
> ifelse(y %in% z, which(y==z), 0 ) ##若y的值包含在z里面,输出y==z的位置,否者输出0,
                                     #此例中没有找到y==z的值, 输出为NA。
[1] NA  0  0 NA
> ifelse(y %in% z, 1, 0 )
[1] 1 0 0 1

### 关于R0012校验位的计算方法 目前并未找到具体针对“R0012”这一特定名称的校验位规则或其详细的计算方法。然而,基于常见的校验机制以及可能的应用场景,可以推测该术语可能是某种自定义编码体系的一部分,或者属于某一行业的专用标准。 #### 可能涉及的技术背景 通常情况下,“R0012”的命名方式暗示了一种序列化编号结构,而这种编号可能会伴随一种校验算法以验证数据完整性。以下是几种常见校验技术及其应用的可能性: 1. **模数法 (Modulo Method)** 许多行业采用模数法作为校验位的基础逻辑。例如,在某些条形码系统中(如EAN-13),最后一位是通过前几位数字按一定权重加权求和后再取模得到的结果[^3]。如果假设“R0012”是一个类似的编号,则可能存在如下形式的校验规则: - 将字符串中的每一位数值提取出来; - 对这些数值按照预设权重相乘并累加; - 使用固定基数(如10或其他整数)对总和取余,得出最终校验值。 2. **CRC循环冗余检验** CRC广泛应用于通信协议与存储设备之中,用来保障传输过程中不会发生误码现象。尽管传统意义上的CRC并不直接适用于短串号如“R0012”,但如果扩展到更复杂的环境里,也可能存在变体版本专门服务于此类需求[^4]。 3. **Luhn Algorithm** Luhn algorithm主要用于信用卡号码有效性检查等领域。它的核心思想是对指定位置上的每位数字执行双倍操作后重新汇总再判断是否满足条件约束。虽然原始设计并非专为像“R0012”这样的标识符定制开发,但在实际工程实践中确实有人借鉴此思路构建专属解决方案[^5]。 #### 推测性的伪代码实现示例 如果没有确切文档说明具体的实施细节的话,可以根据以上提到的各种可能性尝试编写一段通用框架下的模拟程序来探索潜在规律: ```python def calculate_checksum(identifier, method='modulo'): """ A generic function to demonstrate possible checksum calculation methods. Args: identifier (str): The input string e.g., 'R0012'. method (str): Specify which type of check sum you want to try out. Returns: int: Calculated checksum value based on selected method. """ numeric_part = ''.join([c for c in identifier if c.isdigit()]) digits = list(map(int, numeric_part)) if method == 'modulo': weights = [7, 3, 1][:len(digits)] * ((len(digits)//3)+1) # Example weight pattern weighted_sum = sum(digit*weight for digit, weight in zip(digits,weights[:len(digits)])) return weighted_sum % 10 elif method == 'luhn': doubled = [(digit*2 if idx%2==0 else digit) for idx,digit in enumerate(reversed(digits))] adjusted_doubles = [num-(9*(num//10)) for num in doubled] total = sum(adjusted_doubles) return (total * 9) % 10 # Usage example with hypothetical data print(calculate_checksum('R0012',method='modulo')) # Output depends upon defined logic above ``` 请注意这只是一个理论模型展示不同类型的校验手段如何运作,并不代表真实的 “R0012” 编码方案。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值